我有这个示例DataFrame df
:
GridCode,User,DLang
3,224591119,es
3,224591119,ja
3,224591119,zh
4,224591119,es
6,146381773,en
9,17925282,ca
我想对User
字段进行分组,只保留最常用的DLang
代码,然后在每个User
中取消堆叠并计算GridCode
的数量。到目前为止我做了:
d = df.groupby(['GridCode','DLang']).size().unstack().fillna(0)
正确返回:
DLang ca en es ja zh
GridCode
3 0 0 1 1 1
4 0 0 1 0 0
6 0 1 0 0 0
9 1 0 0 0 0
但是,正如您在df
中看到的,有些用户有多个DLang
条目(例如用户224591119),但我只想计算最常用的DLang
代码(例如,那个用户,它是es
)。结果数据框将是:
DLang ca en es
GridCode
3 0 0 1
4 0 0 1
6 0 1 0
9 1 0 0
答案 0 :(得分:0)
首先,计算特定DLang
发生的次数,并计算GridCode
的平均值。
g = df.groupby(['User','DLang']).count().reset_index()
g = g.rename(columns={'GridCode':'occurrences'})
然后,使用first()
函数查找每个用户的最常见/最大出现次数。
h = g.groupby('User').first().reset_index()
将最常见/最大出现次数df与原始输入合并。这将删除用户使用DLang
而不是最常用的行
j = pd.merge(df,h, on=['User','DLang'])
最后,平均每个用户获得最终计数。
final_df = j.groupby(['GridCode','DLang']).size().unstack().fillna(0)
DLang ca en es
GridCode
3 0 0 1
4 0 0 1
6 0 1 0
9 1 0 0