Python 在数据帧中转置数据组
我有一个像这样的大数据帧:Python 在数据帧中转置数据组,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个像这样的大数据帧: |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 | 我如何通过这样的水平分组转换到数据帧
|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
键入上的数据框,然后在dict理解中创建组的键值对,最后沿axis=1使用concat
并传递可选的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
为每个组创建一个顺序计数器,然后创建一个具有两个级别的多级
索引,其中第一个级别是计数器,第二个级别是列类型
本身,最后使用stack
,然后使用unstack
来重塑
:
c = df.groupby('type').cumcount()
df.set_index([c, df['type'].values]).stack().unstack([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
@Manakindf.set_index([df['type'].values,df.groupby('type').cumcount()).unstack(0.0.1,axis=1.sort_index(level=0,axis=1)
起作用,尽管Shubnam有更好的解决方案。同意,一如既往地很好,对我冷淡一点;)感谢@ScottBoston为您提供的宝贵建议。我只是简单地使用了df['Type']。这里的值
是为了避免以后重命名索引:)谢谢@Manakin happy holidays:)@ShubhamSharma我理解并喜欢你的推理。
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