gpt4 book ai didi

python - 转置多列 Pandas 数据框

转载 作者:太空狗 更新时间:2023-10-30 01:01:27 29 4
gpt4 key购买 nike

我正在尝试 reshape 数据框,但无法获得所需的结果。数据框如下所示:

    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

我需要 reshape 数据框,使其看起来像这样:

    m   r   s   p   O       W       N      p    O       W       N     p  O      W       N
1 4 3 1 2.81 3.70 3.03 2 0.58 0.78 0.60 3 1.98 1.34 1.81
1 4 4 1 2.14 2.82 2.31 2 0.67 0.00 0.00 3 0.00 0.04 0.15
1 4 5 1 1.47 1.94 1.59 2 1.03 2.45 1.68 3 0.01 0.00 0.26

我尝试使用pivot_table 函数

df.pivot_table(index=['m','r','s'], columns=['p'], values=['O','W','N']) 

但我无法得到我想要的。有谁知道如何做到这一点?

最佳答案

作为一个认为自己对 pandas 非常得心应手的人,pivot_tablemelt 函数让我感到困惑。我更喜欢坚持使用定义明确且唯一的索引,并使用数据帧本身的 stackunstack 方法。

首先,我会问您是否真的需要像那样重复 p 列?我可以在呈现数据时看到它的值(value),但 IMO pandas 并没有真正设置为那样工作。我们可以硬塞进去,但让我们看看是否有更简单的解决方案可以满足您的需求。

这是我会做的:

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,例如,您可以使用 df[2]df 访问 p = 2 的所有值.xs(2, level='p', axis=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)因为那个列 level 没有名字,所以我们用它的位置代替)

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

关于python - 转置多列 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25852504/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com