我有一个像这样的大数据框:
|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 |
答案 0 :(得分:6)
您可以在 group
上 type
数据帧,然后在字典推导中创建组的键值对,最后使用 concat
沿 axis=1
并传递可选的 {{ 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
索引,其中第一级是计数器,第二级是列 { {1}} 本身,最后使用 multilevel
后跟 type
到 stack
:
unstack
reshape
答案 1 :(得分: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