In python, how to generate random sampling without replacement of a specific column?

Viewed 315

Input data looks somewhat like this

import pandas as pd
df = pd.DataFrame({'users': ['John', 'Bob', 'Alice', 'John', 'Alice','Bob','Alice'], 
                   'class': ['Economics','Economics','Economics','Maths','Maths','Physics','Physics']})

The random data should be generated such that class will not be replaced but users can be replaced.

random_df1 = pd.DataFrame({'users': ['John', 'Bob', 'Alice'], 
                   'class': ['Economics','Maths','Physics']})
or 
random_df2 = pd.DataFrame({'users': ['John', 'John', 'Bob'], 
                   'class': ['Economics','Maths','Physics']})
2 Answers

Use Series.unique to get the unique values in column class then create a new dataframe with users (within a given class) randomly selected using np.random.choice:

df_ = pd.DataFrame([
    {'users': np.random.choice(df.loc[df['class'].eq(c), 'users']), 'class': c}
    for c in df['class'].unique()])

Result:

print(df_)
   users      class
0   John  Economics
1  Alice      Maths
2  Alice    Physics

Use groupby on class column and then use sample method to randomly select samples from particular class

df = df.groupby("class").apply(lambda x: x.sample(1)).reset_index(drop=True)

Output:

   users      class
0    Bob  Economics
1  Alice      Maths
2    Bob    Physics
Related