[英]Dataframe - convert rows to columns - grouped by another columns
我正在尋找如下轉換數據框
原始數據集
團體 | 英里 |
---|---|
一個 | 23 |
一個 | 20 |
一個 | 24 |
一個 | 25 |
乙 | 12 |
乙 | 17 |
乙 | 16 |
乙 | 19 |
我想從上述格式轉換為:
可樂 | Col_B |
---|---|
23 | 12 |
20 | 17 |
24 | 16 |
25 | 19 |
pivot
嘗試:df = df.assign(t= df.groupby('Group').cumcount()).pivot(index = 't', columns ='Group', values = 'Miles').add_prefix('Col_').rename_axis(columns = None).reset_index(drop = True)
pd.concat
:k = pd.concat([g.reset_index(drop=True)['Miles'] for _,g in df.groupby('Group')], 1)
k.columns = ['colA', 'colB']
set_index
/ unstack
的另一種選擇:k = df.set_index(['Group', df.groupby('Group').cumcount()]).unstack(0).add_prefix('Col_').rename_axis(columns= [None,None])
k.columns = k.columns.droplevel()
groupby
/ explode
:k = df.groupby('Group').agg(list).T.apply(pd.Series.explode).add_prefix('Col_')
k = k.reset_index(drop=True).rename_axis(columns = None)
Col_A Col_B
0 23 12
1 20 17
2 24 16
3 25 19
一個pivot_table
選項:
df = (
df.pivot_table(index=df.groupby('Group').cumcount(),
columns='Group',
values='Miles')
.add_prefix('Col_')
.rename_axis(columns=None)
)
df
:
Col_A Col_B
0 23 12
1 20 17
2 24 16
3 25 19
解釋:
使用groupby cumcount
根據每個組中的相對 position 創建一個新索引:
df.groupby('Group').cumcount()
Group new_index
A 0
A 1
A 2
A 3
B 0
B 1
B 2
B 3
然后Group
可以成為寬格式 Frame 中的新列。
df.pivot_table(index=df.groupby('Group').cumcount(),
columns='Group',
values='Miles')
Group A B
0 23 12
1 20 17
2 24 16
3 25 19
然后使用add_prefix
+ rename_axis
進行一些清理:
df.pivot_table(index=df.groupby('Group').cumcount(),
columns='Group',
values='Miles')
.add_prefix('Col_')
.rename_axis(columns=None)
Col_A Col_B
0 23 12
1 20 17
2 24 16
3 25 19
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.