[英]Random sampling of groups after pandas groupby
我有一个大的 dataframe,看起来像这样:
国籍 | 性别 | 回复 |
---|---|---|
美国人 | 女性 | 我不需要这个产品。 |
德语 | 男性 | 看起来不错。 |
芬兰 | 女性 | 我肯定会买一个。 |
等等
我想要做的是从每个组中随机 select 一些响应,以便我可以进一步分析它们。
我的 groupby function 返回了如下内容:
Nationality Sex
American Male 567
American Female 342
German Male 421
German Female 234
Finnish Male 149
Finnish Female 67
等等
我想要一个新的 dataframe,每组有 20 个随机响应。 可以使用 lambda 吗? 因为new_df = df.groupby('Nationality')['Sex'].apply(lambda x: x.sample(20))
没有返回我要找的东西。 有没有办法做到这一点?
使用来自Pandas的 iterrows,您可以将 DataFrame 行作为(索引,系列)对进行迭代,并获得您想要的:
new_df = df.groupby(['Nationality', 'Sex'], as_index=False).size()
for _, row in new_df.iterrows():
print(df[(df.Nationality==row.Nationality)&(df.Sex==row.Sex)].sample(20))
尝试:
df_sample = df.groupby(['Nationality', 'Sex']).sample(20)
MVCE:
import pandas as pd
import numpy as np
df = pd.DataFrame({'Col1':np.random.choice([*'ABC'],100),
'Col3':np.arange(100),
'Col2':np.random.randint(1000,5000,100)})
print(df.groupby('Col1').sample(5))
Output:
Col1 Col3 Col2
83 A 83 1637
58 A 58 4090
17 A 17 4179
86 A 86 3848
74 A 74 2067
49 B 49 4369
50 B 50 4452
42 B 42 4205
7 B 7 2394
54 B 54 3541
40 C 40 3956
67 C 67 4018
9 C 9 4591
48 C 48 1536
26 C 26 2720
您的小组似乎取决于国籍-性别分组。 所以也许你正在寻找:
out = df.groupby(['Nationality', 'Sex'])['Response'].apply(lambda x: x.sample(20))
这将 select 来自每个国籍-性别组的 20 个响应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.