[英]pandas how to sort groupby by group sizes while aggregating on another column
[英]Pandas group double observations by aggregating column
我有一个这样的数据框:
+----------+---------+
| 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
函数,但这不是正确的方法。 解决这个问题的正确方法是什么?
您要做的是根据username
对行进行分组,因此groupby
-function是一种解决方法。 通常,当您使用groupby
时, groupby
聚合函数应用于其余的列,例如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
-column
df.groupby('username').agg({'role': merge_strings})
您可以使用以下命令创建列表或逗号分隔的字符串:
df.groupby('username')['role'].agg(list).reset_index()
输出:
username role
0 bar [admin]
1 foo [user, analyst]
要么
df.groupby('username')['role'].agg(lambda x: ', '.join(x)).reset_index()
输出:
username role
0 bar admin
1 foo user, analyst
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.