Tôi có một khung dữ liệu mà tôi đang tìm cách nhóm và sau đó phân chia các giá trị trong một nhóm thành nhiều cột.Pandas groupby kết quả thành nhiều cột
Ví dụ: nói rằng tôi có dataframe sau:
>>> import pandas as pd
>>> import numpy as np
>>> df=pd.DataFrame()
>>> df['Group']=['A','C','B','A','C','C']
>>> df['ID']=[1,2,3,4,5,6]
>>> df['Value']=np.random.randint(1,100,6)
>>> df
Group ID Value
0 A 1 66
1 C 2 2
2 B 3 98
3 A 4 90
4 C 5 85
5 C 6 38
>>>
Tôi muốn groupby "Tập đoàn" lĩnh vực, lấy tổng của các trường "Value", và nhận được các lĩnh vực mới, mỗi trong số đó nắm giữ các giá trị ID của nhóm.
Hiện nay tôi có thể làm điều này như sau, nhưng tôi đang tìm kiếm một phương pháp làm sạch:
Trước tiên, tôi tạo ra một dataframe với một danh sách các ID trong mỗi nhóm.
>>> g=df.groupby('Group')
>>> result=g.agg({'Value':np.sum, 'ID':lambda x:x.tolist()})
>>> result
ID Value
Group
A [1, 4] 98
B [3] 76
C [2, 5, 6] 204
>>>
Và sau đó tôi sử dụng pd.Series để chia thành các cột, đổi tên chúng và sau đó nối lại.
>>> id_df=result.ID.apply(lambda x:pd.Series(x))
>>> id_cols=['ID'+str(x) for x in range(1,len(id_df.columns)+1)]
>>> id_df.columns=id_cols
>>>
>>> result.join(id_df)[id_cols+['Value']]
ID1 ID2 ID3 Value
Group
A 1 4 NaN 98
B 3 NaN NaN 76
C 2 5 6 204
>>>
Có cách nào để thực hiện việc này mà không phải tạo danh sách các giá trị không?