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