在熊猫数据框中转置数据组
我有一个像这样的大数据框:
|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 🙂