在熊猫数据框中转置数据组

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

|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 |

回答

您可以group在数据帧type,然后创建组的键值对的字典解析里,最后用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后跟unstackto reshape

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

     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

  • Thanks @ScottBoston for your valuable suggestion. I simply used `df['Type'].values` here in order to avoid renaming the index later 🙂

以上是在熊猫数据框中转置数据组的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>