如何在特定值上汇总数据框?

时间:2018-08-01 16:25:27

标签: python pandas pandas-groupby pandas-apply

我说有一个pandas数据框df

ID activity date
1  A        4
1  B        8
1  A        12
1  C        12
2  B        9
2  A        10
3  A        3
3  D        4

我想返回一个表,该表计算精确列表中某些activity的出现次数,在这种情况下说l = [A, B],然后

ID activity(count)_A  activity(count)_B
1  2                  1
2  1                  2
3  1                  0

是我所需要的。

执行此操作最快的方法是什么?理想情况下,没有for循环

谢谢!

编辑:我知道有pivot函数可以完成这种工作。但就我而言,我的activity类型比列表l中实际需要的数量多得多。使用pivot仍然是最佳选择吗?

3 个答案:

答案 0 :(得分:1)

您可以将isinboolean indexing一起使用,然后进行旋转-最快的应该是groupbysizeunstack,然后是{{3} }和最后pivot_table,最好用真实数据测试每个解决方案:

df2 = (df[df['activity'].isin(['A','B'])]
         .groupby(['ID','activity'])
         .size()
         .unstack(fill_value=0)
         .add_prefix('activity(count)_')
         .reset_index()
         .rename_axis(None, axis=1))

print (df2)
   ID  activity(count)_A  activity(count)_B
0   1                  2                  1
1   2                  1                  1
2   3                  1                  0

或者:

df1 = df[df['activity'].isin(['A','B'])]

df2 = (pd.crosstab(df1['ID'], df1['activity'])
        .add_prefix('activity(count)_')
        .reset_index()
        .rename_axis(None, axis=1))

或者:

df2 = (df[df['activity'].isin(['A','B'])]
          .pivot_table(index='ID', columns='activity', aggfunc='size', fill_value=0)
          .add_prefix('activity(count)_')
          .reset_index()
          .rename_axis(None, axis=1))

答案 1 :(得分:0)

我相信df.groupby('activity').size().reset_index(name='count') 应该如您所愿。

答案 2 :(得分:0)

只需通过Counter进行聚合并使用pd.DataFrame默认构造函数

from collections import Counter

agg_= df.groupby(df.index).ID.agg(Counter).tolist()
ndf = pd.DataFrame(agg_)

    A   B   C   D
0   2   1.0 1.0 NaN
1   1   1.0 NaN NaN
2   1   NaN NaN 1.0

如果您有l = ['A', 'B'],只需过滤

ndf[l]

    A   B   
0   2   1.0 
1   1   1.0 
2   1   NaN