[英]Pivot pandas dataframe using group by
我有一個像這樣的數據框:
id sub_id count
0 94 1
1 94 9
1 315 7
2 94 4
2 265 1
data = {'id': [0,1,1,2,2],
'sub_id': [94,94,315,94,265],
'count': [1,9,7,4,1]
}
df = pd.DataFrame(data)
And I want it in the following form:
id sub_id1 count_sub_id1 sub_id2 count_sub_id2
0 94 1 NaN NaN
1 94 9 315 7
2 94 4 265 1
注意:在這里,每個id
最多可以包含兩行,每行具有不同的sub_id
及其計數。
我嘗試了這個df.pivot(index='id',columns='sub_id',values='count')
但這導致第二列中的所有行都被擴展為不同的列,而我只需要兩列自定義名稱,即 每組id
s僅存在兩行
嘗試使用:
df_out = (df.set_index(['id', df.groupby('id').cumcount()+1])
.unstack().sort_index(level=1, axis=1))
df_out.columns = [f'{i}{j}' if i == "sub_id" else f'{i}_sub_id{j}'
for i, j in df_out.columns]
print(df_out.reset_index())
輸出:
id count_sub_id1 sub_id1 count_sub_id2 sub_id2
0 0 1.0 94.0 NaN NaN
1 1 9.0 94.0 7.0 315.0
2 2 4.0 94.0 1.0 265.0
output_df = pd.concat([df.groupby('id')['sub_id'].apply(list).apply(pd.Series),
df.groupby('id')['count'].apply(list).apply(pd.Series)], axis =1)
output_df.columns = ['sub_id1', 'sub_id2', 'count_sub_id1', 'count_sub_id2']
>>>output_df
sub_id1 sub_id2 count_sub_id1 count_sub_id2
0 94.0 NaN 1.0 NaN
1 94.0 315.0 9.0 7.0
2 94.0 265.0 4.0 1.0
這是另一種方式:
df_out = (df.groupby('id')
.apply(lambda x: x.reset_index(drop=True).head(2))
.drop('id', axis=1)
.unstack()
)
輸出:
sub_id count
0 1 0 1
id
0 94.0 NaN 1.0 NaN
1 94.0 315.0 9.0 7.0
2 94.0 265.0 4.0 1.0
重命名:
df_out.columns = [f'{i}{j+1} for i,j in df_out.columns]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.