我有一个这样的数据框:
+----------+---------+
| 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
函数,但这不是正确的方法。
解决这个问题的正确方法是什么?
答案 0 :(得分:3)
您想要做的是基于username
对行进行分组,因此groupby
函数是一种解决方法。通常,当您使用groupby
时,会将aggregation function应用于其余的列,例如sum
,average
,min
或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