gpt4 book ai didi

python - 将一些行转到 DataFrame 中的新列

转载 作者:行者123 更新时间:2023-12-01 21:34:04 25 4
gpt4 key购买 nike

我正在寻找一种 pythonic 和 pandemic(来自 pandas,双关语不是故意 =)将数据框中的某些行转换为新列的方法。

我的数据有这种格式:

           dof  foo  bar  qux
idxA idxB
100 101 1 10 30 50
101 2 11 31 51
101 3 12 32 52
102 1 13 33 53
102 2 14 34 54
102 3 15 35 55
200 101 1 16 36 56
101 2 17 37 57
101 3 18 38 58
102 1 19 39 59
102 2 20 40 60
102 3 21 41 61

变量 foobarqux 实际上有 3 维坐标,我想称之为 foo1foo2foo3bar1、...、qux3。这些由 dof 列标识。每行代表 3D 中的一个轴,dof == 1 是 x 轴,dof == 2 是 y 轴,dof == 3是z轴。

所以,这是我想要的最终数据框:

           foo1  bar1  qux1  foo2  bar2  qux2  foo3  bar3  qux3
idxA idxB
100 101 10 30 50 11 31 51 12 32 52
102 13 33 53 14 34 54 15 35 55
200 101 16 36 56 17 37 57 18 38 58
102 19 39 59 20 40 60 21 41 61

问题是:最好的方法是什么?


这是我所做的。

在数据框中重新创建我的数据集的代码:

import pandas as pd

data = [[100, 101, 1, 10, 30, 50],
[100, 101, 2, 11, 31, 51],
[100, 101, 3, 12, 32, 52],
[100, 102, 1, 13, 33, 53],
[100, 102, 2, 14, 34, 54],
[100, 102, 3, 15, 35, 55],
[200, 101, 1, 16, 36, 56],
[200, 101, 2, 17, 37, 57],
[200, 101, 3, 18, 38, 58],
[200, 102, 1, 19, 39, 59],
[200, 102, 2, 20, 40, 60],
[200, 102, 3, 21, 41, 61],
]

df = pd.DataFrame(data=data, columns=['idxA', 'idxB', 'dof', 'foo', 'bar', 'qux'])
df.set_index(['idxA', 'idxB'], inplace=True)

做我想做的事的代码:

df2 = df[df.dof == 1].reset_index()[['idxA', 'idxB']]
df2.set_index(['idxA', 'idxB'], inplace=True)
for pivot in [1, 2, 3]:
df2.loc[:, 'foo%d' % pivot] = df[df.dof == pivot]['foo']
df2.loc[:, 'bar%d' % pivot] = df[df.dof == pivot]['bar']
df2.loc[:, 'qux%d' % pivot] = df[df.dof == pivot]['qux']

但是,我对这些 .loc 调用和数据框的增量列添加不太满意。我认为 pandas 很棒,因为它有一种更简洁的方式来做到这一点。单线会非常酷。

最佳答案

你可以试试df.pivot

df = df.pivot(columns='dof')
foo bar qux
dof 1 2 3 1 2 3 1 2 3
idxA idxB
100 101 10 11 12 30 31 32 50 51 52
102 13 14 15 33 34 35 53 54 55
200 101 16 17 18 36 37 38 56 57 58
102 19 20 21 39 40 41 59 60 61

现在加入使用 df.columns

df.columns = df.columns.map('{0[0]}{0[1]}'.format) #suggested by @YOBEN_S

foo1 foo2 foo3 bar1 bar2 bar3 qux1 qux2 qux3
idxA idxB
100 101 10 11 12 30 31 32 50 51 52
102 13 14 15 33 34 35 53 54 55
200 101 16 17 18 36 37 38 56 57 58
102 19 20 21 39 40 41 59 60 61

关于python - 将一些行转到 DataFrame 中的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62160816/

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