Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:将数据框中的列与为公共变量创建的新列合并_Python_Pandas_Dataframe - Fatal编程技术网

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

Python 熊猫:将数据框中的列与为公共变量创建的新列合并,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧: 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 , ,

我有以下数据帧:

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行中的值,这些值不应包含在最终集合中

这一定很简单,但我对pandas还不熟悉,正在努力找到正确的命令来使用

提前感谢您的帮助。

您可以使用:

  • 对于重塑,最后一个
    索引到列
  • for extrah列,带有for parse by regex
  • 更改列顺序


哇,谢谢你的快速回复。这毕竟不是那么容易(至少对我来说)。我用我的数据集尝试了你的解决方案,结构很好,但我的所有值都是NaN。重置索引(name='b')中的'b'是什么?Opps,typo,它是
Val
NaN
s-所有值都是NaNs?什么是
set_index()
之前原始数据的
print(df.info())
?不是在我将“b”替换为“Val”之后,现在我得到了一些值。但当有空值时,我仍然有一些混乱。Foo | Bar、A | B列包含nan,Val包含“Foo”、“Bar”、“A”、“B”和值,这意味着当存在空值时,合并不会正确处理。让我检查一下原始数据框。给这个人一个大奖杯,感谢他/她在聊天中给我的巨大帮助,这最终解决了我的问题!
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