簡體   English   中英

給定 dataframe,groupby 后跟 sum 操作,並在特定列中為每個類別創建新列

[英]Given a dataframe, groupby followed by sum operation and create new columns per each category in a specific column

從 dataframe df開始,我想對特定列中的每個類別進行分組和求和,並為每個類別創建一個新列(請參見下面的示例以及所需的輸出)。 例如,給出 dataframe df

data = {"ID": ["111", "111","111" , "2A2","3B3","4C4","5D5","6E6",],
"category": ["A", "B", "A","A","B","B","C","C",],
"length": [1,2,4,1,2,2,1,3],}
df = pd.DataFrame(data)

我想獲得原始的 dataframe df 以及按“ID”分組的附加列 A、B、C(“類別”列中每個唯一屬性一個新列)

到目前為止,我已經檢查了一些類似的答案,但我無法解決這個問題。

這是我在沒有得到所需 output 的情況下采用的一種方法:

grouped_multiple = df.groupby(['ID','material']).agg({'length': [np.sum, np.sum, np.sum]})
grouped_multiple.columns = ["A", "B", "C"]
grouped_multiple = grouped_multiple.reset_index()
print(grouped_multiple)

輸出:

輸出

但是我想要的 output 看起來像

    ID  category A B C
0   111   A      5 2 0
1   2A2   A      1 0 0
2   3B3   B      0 2 0
3   4C4   B      0 2 0
4   5D5   C      0 0 1
5   6E6   C      0 0 3

類別列中的每個元素都按 ID 和類別分組,然后求和,然后為類別列中的每個唯一值創建列。

謝謝你的幫助!

編輯:解決方案工作正常:我想擴展三點。 首先動態轉換新列的名稱,

    ID  category Custom_name_A Custom_name_B Custom_name_C  
0   111   A          5               2           0
1   2A2   A          1               0           0
2   3B3   B          0               2           0
3   4C4   B          0               2           0
4   5D5   C          0               0           1
5   6E6   C          0               0           3

其次,如果我有幾年/十年的附加專欄

data = {"ID": ["111", "111","111" , "2A2","3B3","4C4","5D5","6E6",],
"category": ["A", "B", "A","A","B","B","C","B",],
"date": ["2020", "2010","2010", "1990", "1990","2010","2020","1990"]
"length": [1,2,4,1,2,2,1,3],}

我想看到以下所需的 output:(CN = 自定義名稱,表示我需要的任何字符串)

output 示例

最后:我希望這個 output 反映在原始 dataframe 中(因為還有其他未使用的列,我希望它們在最后一組中)非常感謝!

df.groupby(['ID', 'category'])['length'].sum().unstack().fillna(0)

Output:

category    A   B    C
ID          
111        5.0  2.0  0.0
2A2        1.0  0.0  0.0
3B3        0.0  2.0  0.0
4C4        0.0  2.0  0.0
5D5        0.0  0.0  1.0
6E6        0.0  0.0  3.0

通過添加 rename() 您可以手動自定義列名

df = df.groupby(['ID', 'category'])['length'].sum().unstack().fillna(0).rename(columns={'A':'Cat_A', 'B':'Cat_B'})
df.columns
Index(['Cat_A', 'Cat_B', 'C'], dtype='object', name='category')

更新:

在這里,我已為您第二次提供的d命名

d.groupby(['ID','category','date'])['length'].sum().unstack().fillna(0).reset_index('category').groupby(['ID','category'])['1990','2010','2020'].sum().unstack().fillna(0)

Output:

date            1990        2010      2020
category    A   B   C   A   B   C   A   B   C
ID                                  
111      0.0   0.0  0.0 4.0 2.0 0.0 1.0 0.0 0.0
2A2      1.0   0.0  0.0 0.0 0.0 0.0 0.0 0.0 0.0
3B3      0.0   2.0  0.0 0.0 0.0 0.0 0.0 0.0 0.0
4C4      0.0   0.0  0.0 0.0 2.0 0.0 0.0 0.0 0.0
5D5      0.0   0.0  0.0 0.0 0.0 0.0 0.0 0.0 1.0
6E6      0.0   3.0  0.0 0.0 0.0 0.0 0.0 0.0 0.0

此外,您可以根據需要清理 dfs 和 concat。

IIUC, pivot_table應該可以完成這項工作 -

df.pivot_table(values="length", index="ID", columns="category", aggfunc='sum').fillna(0).astype(int)

Output

category  A  B  C
ID               
111       5  2  0
2A2       1  0  0
3B3       0  2  0
4C4       0  2  0
5D5       0  0  1
6E6       0  0  3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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