python转置数据_python – 转置多列Pandas数据帧

这篇博客探讨了如何利用Pandas的pivot_table和unstack功能处理多级索引数据,以及如何通过堆栈和非堆栈方法进行数据转换。作者展示了如何创建和访问MultiIndex列,并提供了简化数据结构的技巧,包括按级别选择列和添加列值。此外,还讨论了如何手动添加列并重新索引以包含特定值。
摘要由CSDN通过智能技术生成

作为一个自认为与熊猫非常方便的人,pivot_table和融合功能让我感到困惑.我更喜欢坚持使用定义明确且唯一的索引,并使用数据框本身的堆栈和非堆栈方法.

首先,我会问你是否真的需要像这样重复p列?我可以在呈现数据时看到它的价值,但IMO熊猫并没有真正设置为这样工作.我们可以把它塞进去,但让我们看看一个更简单的解决方案是否能满足你的需求.

这就是我要做的事情:

from io import StringIO

import pandas

datatable = StringIO("""\

m r s p O W N

1 4 3 1 2.81 3.70 3.03

1 4 4 1 2.14 2.82 2.31

1 4 5 1 1.47 1.94 1.59

1 4 3 2 0.58 0.78 0.60

1 4 4 2 0.67 0.00 0.00

1 4 5 2 1.03 2.45 1.68

1 4 3 3 1.98 1.34 1.81

1 4 4 3 0.00 0.04 0.15

1 4 5 3 0.01 0.00 0.26""")

df = (

pandas.read_table(datatable, sep='\s+')

.set_index(['m', 'r', 's', 'p'])

.unstack(level='p')

)

df.columns = df.columns.swaplevel(0, 1)

df.sort(axis=1, inplace=True)

print(df)

哪个印刷品:

p 1 2 3

O W N O W N O W N

m r s

1 4 3 2.81 3.70 3.03 0.58 0.78 0.60 1.98 1.34 1.81

4 2.14 2.82 2.31 0.67 0.00 0.00 0.00 0.04 0.15

5 1.47 1.94 1.59 1.03 2.45 1.68 0.01 0.00 0.26

所以现在列是一个MultiIndex,你可以访问所有的值,其中p = 2,df [2]或df.xs(2,level =’p’,轴= 1),这给了我:

O W N

m r s

1 4 3 0.58 0.78 0.60

4 0.67 0.00 0.00

5 1.03 2.45 1.68

同样,你可以得到所有的W列:df.xs(‘W’,level = 1,axis = 1)

(我们说level = 1)因为该列级没有名称,所以我们改用它的位置)

p 1 2 3

m r s

1 4 3 3.70 0.78 1.34

4 2.82 0.00 0.04

5 1.94 2.45 0.00

您可以使用axis = 0来查询列.

如果您确实需要列中的p值,只需手动添加它并重新索引列:

for p in df.columns.get_level_values('p').unique():

df[p, 'p'] = p

cols = pandas.MultiIndex.from_product([[1,2,3], list('pOWN')])

df = df.reindex(columns=cols)

print(df)

1 2 3

p O W N p O W N p O W N

m r s

1 4 3 1 2.81 3.70 3.03 2 0.58 0.78 0.60 3 1.98 1.34 1.81

4 1 2.14 2.82 2.31 2 0.67 0.00 0.00 3 0.00 0.04 0.15

5 1 1.47 1.94 1.59 2 1.03 2.45 1.68 3 0.01 0.00 0.26

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值