【发布时间】:2021-08-26 21:46:03
【问题描述】:
我正在寻找如下转换数据框
原始数据集
| Group | Miles |
|---|---|
| A | 23 |
| A | 20 |
| A | 24 |
| A | 25 |
| B | 12 |
| B | 17 |
| B | 16 |
| B | 19 |
我想从上面的格式转换成这个:
| Col_A | Col_B |
|---|---|
| 23 | 12 |
| 20 | 17 |
| 24 | 16 |
| 25 | 19 |
【问题讨论】:
-
欢迎来到 SO,我建议您查看How to write a good question。您应该首先解释您首先尝试过的内容等
我正在寻找如下转换数据框
原始数据集
| Group | Miles |
|---|---|
| A | 23 |
| A | 20 |
| A | 24 |
| A | 25 |
| B | 12 |
| B | 17 |
| B | 16 |
| B | 19 |
我想从上面的格式转换成这个:
| Col_A | 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创建一个新索引:
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
【讨论】: