我想对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
请注意,user1
和user2
与count
处于同一级别(合并的副作用)。
所需的输出:
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)
答案 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()