Pandas Dataframe从分组中选择随机行,并查找每个分组的平均值

时间:2017-01-12 07:05:44

标签: python pandas

我有一个如下所示的数据帧df:

             ID1       ID2         Bool           Count
0       12868123  387DB71C            0               1
1       12868123  84C0E502            1              11
2       12868123  387DB71C            1               1
8       12868123  80A9DCFC            0              16
9       12868123  7A260136            1              20
10      12868123  80A9DCFC            0              16
11      12868123  80BB4591            0              36
327295  8617B7D9  76A08B0E            0              19
327296  8617B7D9  76A08B0E            0              19
327297  8617B7D9  76D0DA26            1               2
327298  8617B7D9  7C92B2A6            1               3
327299  8617B7D9  75883296            1               1
327300  8617B7D9  78711A4F            0              12
327301  8617B7D9  78711A4F            0              12
327302  8617B7D9  78711A4F            0              12

我想做两件事:

1-我想"随机"为每个n实例提取(ID1, Bool)个唯一行。 因此,如果n = 2,可能的结果可能是:

             ID1       ID2         Bool           Count
0       12868123  387DB71C            0               1
8       12868123  80A9DCFC            0              16
1       12868123  84C0E502            1              11
2       12868123  387DB71C            1               1
327295  8617B7D9  76A08B0E            0              19
327296  8617B7D9  76A08B0E            0              19
327297  8617B7D9  76D0DA26            1               2
327298  8617B7D9  7C92B2A6            1               3

我试着寻找df.groupby(' ID1',' Bool')。随机(size = n),但无法想象它进行。

2-然后我想计算每个Count对的平均值(ID1, Bool)。因此,最终得到的DF是:

            ID1        Bool           AverageCount
0       12868123         0              8.5
1       12868123         1              6
2       8617B7D9         0              19
3       8617B7D9         1              2.5

我想我有第二部分想通了:

df.groupby(['ID1','Bool'])['Count'].mean()

2 个答案:

答案 0 :(得分:3)

groupby + sample

df.groupby(
    ['ID1', 'Bool']
).apply(
    lambda df: df.sample(2).Count.mean()
).reset_index(name='AverageCount')

enter image description here

答案 1 :(得分:3)

您可以将groupbynumpy.random.choice

一起使用
n = 2
df1 = df.groupby(['ID1', 'Bool'])['Count'] \
        .apply(lambda x: np.mean(np.random.choice(x, n))) \
        .reset_index(name='AverageCount')
print (df1)
        ID1  Bool  AverageCount
0  12868123     0          18.5
1  12868123     1           6.0
2  8617B7D9     0          19.0
3  8617B7D9     1           3.0