在pandas数据框中转置一组数据

3

我有一个像这样的大型数据框:

|type| qt  | vol|
|----|---- | -- |
| A  | 1   | 10 |
| A  | 2   | 12 |
| A  | 1   | 12 |
| B  | 3   | 11 |
| B  | 4   | 20 |
| B  | 4   | 20 |
| C  | 4   | 20 |
| C  | 4   | 20 |
| C  | 4   | 20 |
| C  | 4   | 20 |

如何水平分组转置数据框?

|A.            |B.            |C.            |
|--------------|--------------|--------------|
|type| qt | vol|type| qt | vol|type| qt | vol|
|----|----| ---|----|----| ---|----|----| ---|
| A  | 1  | 10 | B  | 3  | 11 | C  | 4  | 20 |
| A  | 2  | 12 | B  | 4  | 20 | C  | 4  | 20 |
| A  | 1  | 12 | B  | 4  | 20 | C  | 4  | 20 |
                              | C  | 4  | 20 |
2个回答

6
您可以将数据框按类型分组,然后在字典理解中创建组的键值对,最后使用concat将其沿着axis=1连接,并传递可选参数keys以获得最终结果:
d = {k:g.reset_index(drop=True) for k, g in df.groupby('type')}
pd.concat(d.values(), keys=d.keys(), axis=1)

或者您可以使用 groupby + cumcount 来为每个组创建一个顺序计数器,然后创建具有两个级别的 multilevel 索引,其中第一级是计数器,第二级是列 type 本身,最后使用 stack ,然后是 unstack 以进行 reshape :

<code><code><code>c = df.groupby('type').cumcount()
df.set_index([c, df['type'].values]).stack().unstack([1, 2])
</code></code></code>

     A              B              C       
  type   qt  vol type   qt  vol type qt vol
0    A    1   10    B    3   11    C  4  20
1    A    2   12    B    4   20    C  4  20
2    A    1   12    B    4   20    C  4  20
3  NaN  NaN  NaN  NaN  NaN  NaN    C  4  20

1
@Manakin df.set_index([df['type'].values, df.groupby('type').cumcount()]).unstack(0).swaplevel(0,1, axis=1).sort_index(level=0, axis=1) 是可行的,尽管Shubnam提供了更好的解决方案。 - Scott Boston
1
一致同意,一如既往地非常好。请你享受我请你吃的 idly(印度食品)吧 ;) - Umar.H
2
感谢@ScottBoston提供的宝贵建议。我只是在这里使用了df['Type'].values,以避免后来重命名索引 :) - Shubham Sharma
1
感谢 @Manakin,祝您节日快乐 :) - Shubham Sharma
1
@ShubhamSharma 我理解并且喜欢你在这里的推理。 - Scott Boston
显示剩余2条评论

2

这基本上是按一列进行透视:

(df.assign(idx=df.groupby('type').cumcount())
   .pivot(index='idx',columns='type', values=df.columns)
   .swaplevel(0,1, axis=1)
   .sort_index(axis=1)
)

输出:

type    A              B            C         
       qt type  vol   qt type  vol qt type vol
idx                                           
0       1    A   10    3    B   11  4    C  20
1       2    A   12    4    B   20  4    C  20
2       1    A   12    4    B   20  4    C  20
3     NaN  NaN  NaN  NaN  NaN  NaN  4    C  20

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接