pandas - 在MultiIndex DataFrame中具有最常见值的unstack

时间:2015-04-21 14:32:31

标签: python pandas

我有这个示例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

1 个答案:

答案 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