具有MultiIndex列和不同级别的Pandas groupby

时间:2018-09-04 13:54:01

标签: pandas

我想对MultiIndex数据框进行分组,计算user2中每个df每一列的出现次数:

>>> df
      user1 user2 count
                   0             1      2
                   a      x      d      a 
    0  2     6     0      1      0      0
    1  4     6     0      0      0      3
    2  21    76    2      0      1      0
    3  5     18    0      0      0      0

请注意,user1user2count处于同一级别(合并的副作用)。

所需的输出

  user2 count
        0              1      2
        a       x      d      a 
0  6    0       1      0      1
1  76   1       0      0      0    
3  18   0       0      0      0  

我尝试过

>>> df.groupby(['user2','count'])

但我明白了

ValueError: Grouper for 'count' not 1-dimensional

发电机代码:

df = pd.DataFrame({'user1':[2,4,21,21],'user2':[6,6,76,76],'param1':[0,2,0,1],'param2':['x','a','a','d'],'count':[1,3,2,1]}, columns=['user1','user2','param1','param2','count'])
df = df.set_index(['user1','user2','param1','param2'])
df = df.unstack([2,3]).sort_index(axis=1).reset_index()

df2 = pd.DataFrame({'user1':[2,5,21],'user2':[6,18,76]})
df2.columns = pd.MultiIndex.from_product([df2.columns, [''],['']])
final_df = df2.merge(df, on=['user1','user2'], how='outer').fillna(0)

1 个答案:

答案 0 :(得分:3)

IIUC,您想要

final_df.where(final_df>0).groupby('user2').count().drop('user1', axis=1).reset_index()

输出:

  user2 count         
            0     1  2
            a  x  d  a
0     6     0  1  0  1
1    18     0  0  0  0
2    76     1  0  1  0

避免删除列,仅选择“计数”,并将功能更改为sum

final_df.where(final_df>0).groupby('user2').sum()[['count']].reset_index()

输出:

  user2 count               
            0         1    2
            a    x    d    a
0     6   0.0  1.0  0.0  3.0
1    18   0.0  0.0  0.0  0.0
2    76   2.0  0.0  1.0  0.0

要使删除user2等于零值也无效。

final_df[['count']].where(final_df[['count']]>0)\ .groupby(final_df.user2).sum().reset_index()