Диспропорциональная стратифицированная выборка в Pandas - PullRequest
0 голосов
/ 01 февраля 2020

Как можно случайно выбрать одну строку из каждой группы (столбец Name) в следующем кадре данных:

   Distance   Name  Time  Order
1        16   John     5      0
4        31   John     9      1
0        23   Kate     3      0
3        15   Kate     7      1
2        32  Peter     2      0
5        26  Peter     4      1

Ожидаемый результат:

Distance   Name  Time  Order

4        31   John     9      1
0        23   Kate     3      0
2        32  Peter     2      0

Ответы [ 6 ]

4 голосов
/ 01 февраля 2020

Вы можете использовать groupby на Name col и применять sample

df.groupby('Name',as_index=False).apply(lambda x:x.sample()).reset_index(drop=True)

    Distance   Name  Time  Order
0        31   John     9      1
1        15   Kate     7      1
2        32  Peter     2      0
2 голосов
/ 01 февраля 2020

Вы можете перемешать все сэмплы, используя, например, функцию numpy random.permutation. Затем groupby на Name и возьмите N первых строк из каждой группы:

df.iloc[np.random.permutation(len(df))].groupby('Name').head(1)
1 голос
/ 01 февраля 2020

Вы можете достичь этого, используя unique

df['Name'].unique()
0 голосов
/ 01 февраля 2020

Как насчет использования random

, например,

Импортируйте предоставленные вами данные,

df=pd.read_csv('random_data.csv', header=0)

, которое выглядит следующим образом,

Distance  Name  Time  Order
1        16  John     5      0
4         3  John     9      1
0        23  Kate     3      0
3        15  Kate     7      1

затем получите случайное имя столбца,

colname = df.columns[random.randint(1, 3)]

и под ним выберите «Имя»,

   print(df[colname])
1    John
4    John
0    Kate
3    Kate
Name: Name, dtype: object

Конечно, я мог бы сжать это до,

print(df[df.columns[random.randint(1, 3)]])
0 голосов
/ 01 февраля 2020
df.drop_duplicates(subset='Name')



   Distance   Name  Time  Order
1        16   John     5      0
0        23   Kate     3      0
2        32  Peter     2      0

Это должно помочь, но это не случайный выбор, оно сохраняет первое

0 голосов
/ 01 февраля 2020

Перемешать фрейм данных:

df.sample(frac=1)

, а затем отбросить дублированные строки:

df.drop_duplicates(subset=['Name'])
...