Pandas:将数据框中的列与为公共变量创建的新列合并

2024-10-04 03:29:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧:

ID,SomeValue,FooA1,FooA2,FooA3,FooB1,FooB2,FooB3,BarA1,BarA2,BarA3,BarB1,BarB2,BarB3
1 ,val1     ,4    ,7    ,2    ,8    ,1    ,3    ,2    ,9    ,2    ,0    ,9    ,2
2 ,val2     ,2    ,3    ,8    ,     ,     ,     ,1    ,5    ,3    ,     ,     , 
.
.

我想合并列“[Foo | Bar][A | B]\d+”,这样它们就变成了以下内容,即合并多个列的不同组合,并创建适当的新列来包含表示这些变化的变量:

ID,SomeValue,FooBar    ,AB    ,Num    ,Val
1 ,val1     ,Foo       ,A     ,1      ,4
1 ,val1     ,Foo       ,A     ,2      ,7
1 ,val1     ,Foo       ,A     ,3      ,2
1 ,val1     ,Foo       ,B     ,1      ,8
1 ,val1     ,Foo       ,B     ,2      ,1
1 ,val1     ,Foo       ,B     ,3      ,3
1 ,val1     ,Bar       ,A     ,1      ,2
1 ,val1     ,Bar       ,A     ,2      ,9
1 ,val1     ,Bar       ,A     ,3      ,2
1 ,val1     ,Bar       ,B     ,1      ,0
1 ,val1     ,Bar       ,B     ,2      ,9
1 ,val1     ,Bar       ,B     ,3      ,2
2 ,val2     ,Foo       ,A     ,1      ,2
2 ,val2     ,Foo       ,A     ,2      ,3
2 ,val2     ,Foo       ,A     ,3      ,8
2 ,val2     ,Bar       ,A     ,1      ,1
2 ,val2     ,Bar       ,A     ,2      ,5
2 ,val2     ,Bar       ,A     ,3      ,3

请注意,可以有空值,例如在上面的第2行中,这些值不应包含在最终集合中

这一定很简单,但我是新来的熊猫,正在努力找到正确的命令使用

事先谢谢你的帮助


Tags: 数据idfoobarval1val2somevaluebara1
1条回答
网友
1楼 · 发布于 2024-10-04 03:29:38

您可以使用:

  • ^{}^{}表示重塑,最后index到列^{}
  • ^{}表示extra列,而^{}表示regex解析
  • ^{}用于更改列顺序

df = df.set_index(['ID','SomeValue']).stack().reset_index(name='Val')
df[['FooBar','AB','Num']] = df.pop('level_2').str.extract('(Foo|Bar)(A|B)(\d+)', expand=True)
cols = ['ID', 'SomeValue', 'FooBar', 'AB', 'Num','Val']
df = df.reindex_axis(cols, axis=1)
print (df)
    ID SomeValue FooBar AB Num  Val
0    1      val1    Foo  A   1  4.0
1    1      val1    Foo  A   2  7.0
2    1      val1    Foo  A   3  2.0
3    1      val1    Foo  B   1  8.0
4    1      val1    Foo  B   2  1.0
5    1      val1    Foo  B   3  3.0
6    1      val1    Bar  A   1  2.0
7    1      val1    Bar  A   2  9.0
8    1      val1    Bar  A   3  2.0
9    1      val1    Bar  B   1  0.0
10   1      val1    Bar  B   2  9.0
11   1      val1    Bar  B   3  2.0
12   2      val2    Foo  A   1  2.0
13   2      val2    Foo  A   2  3.0
14   2      val2    Foo  A   3  8.0
15   2      val2    Foo  B   1  1.0
16   2      val2    Foo  B   2  5.0
17   2      val2    Foo  B   3  3.0

相关问题 更多 >