我有以下数据框:
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 的新手,正在努力寻找正确的命令来使用。
预先感谢您的帮助。
最佳答案
您可以使用:
-
DataFrame.set_index
与unstack
对于 reshape ,最后一个索引
到列reset_index
-
DataFrame.pop
对于额外列str.extract
通过正则表达式进行解析 -
reindex_axis
用于更改列顺序
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
关于python - Pandas:将数据框中的列与为公共(public)变量创建的新列合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45649638/