[英]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.