熊猫通过汇总列对双重观测进行分组

时间:2018-09-11 13:03:23

标签: python pandas

我有一个这样的数据框:

+----------+---------+
| username | role    |
+----------+---------+
| foo      | user    |
+----------+---------+
| foo      | analyst |
+----------+---------+
| bar      | admin   |
+----------+---------+

并且我想通过汇总列角色以获取以下数据框的方式来消除出现两次或两次以上的用户的重复:

+----------+---------------+
| username | role          |
+----------+---------------+
| foo      | user, analyst |
+----------+---------------+
| bar      | admin         |
+----------+---------------+

到目前为止,我已经尝试过以这种方式使用数据透视表:

table = pd.pivot_table(df, index='username', columns='role')

以及groupby函数,但这不是正确的方法。 解决这个问题的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

您想要做的是基于username对行进行分组,因此groupby函数是一种解决方法。通常,当您使用groupby时,会将aggregation function应用于其余的列,例如sumaveragemin或similair。但是,您也可以定义自己的聚合函数,并在agg中使用它。

def merge_strings(series):
    # This function will get a series of all the values in a column. For example for foo the series will be ['user', 'analyst'].
    # We can use the built in function str.cat() fo contatenate a series of strings.

    return series.str.cat(sep=', ')

然后,我们简单地调用groupby,并告诉我们要使用自定义函数汇总role

df.groupby('username').agg({'role': merge_strings})

答案 1 :(得分:1)

您可以使用以下命令创建列表或逗号分隔的字符串:

df.groupby('username')['role'].agg(list).reset_index()

输出:

  username             role
0      bar          [admin]
1      foo  [user, analyst]

OR

df.groupby('username')['role'].agg(lambda x: ', '.join(x)).reset_index()

输出:

  username           role
0      bar          admin
1      foo  user, analyst