如何在熊猫中将多列合并为一列?
我有这张桌子:
ID | A | B | C | D
1 1 1 0 3
2 1 0 1 2
3 0 0 1 8
我想要这张桌子:
ID | X | D
1 A 3
1 B 3
2 A 2
2 C 2
3 C 8
我想根据它们的值将A,B,C列合并到X列中。如果一个ID具有多个合并列(A / B / C)的true(1)值,则将有该ID的新行副本。
答案 0 :(得分:3)
您可以使用melt
重塑DataFrame的形状,然后使用query
选择相关行和drop
仅保留相关的列和行,以删除现在过时的列,如下所示:
(df.melt(id_vars=['ID', 'D'], var_name='X')
.query('value == 1')
.drop(columns=['value']))
# ID D X
#0 1 3 A
#1 2 2 A
#3 1 3 B
#7 2 2 C
#8 3 8 C
融化后的DataFrame如下所示:
# ID D X value
#0 1 3 A 1
#1 2 2 A 1
#2 3 8 A 0
#3 1 3 B 1
#4 2 2 B 0
#5 3 8 B 0
#6 1 3 C 0
#7 2 2 C 1
#8 3 8 C 1
通过将ID
和D
用作id_vars
,对于所有其他变量(A
,B
和{{ 1}})。这些列的值现在位于C
列中。然后,将行保留在value
答案 1 :(得分:0)
可能的解决方案之一:
df2 = df.set_index('ID')
df2[['A', 'B', 'C']].multiply(df2['D'], axis='index').reset_index()\
.melt(id_vars='ID', var_name='X', value_name='D').query('D > 0')\
.sort_values('ID')
结果是:
ID X D
0 1 A 3
3 1 B 3
1 2 A 2
7 2 C 2
8 3 C 8
与您想要的结果相比,还有一个附加的(索引)列, 但我认为这并不重要。