簡體   English   中英

熊貓通過匯總列對雙重觀測進行分組

[英]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 聚合函數應用於其余的列,例如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 -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM