繁体   English   中英

pandas groupby后分组随机抽样

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM