根据布尔值将多列合并为大熊猫中的一列

时间:2019-03-06 18:53:09

标签: python-3.x pandas dataframe

如何在熊猫中将多列合并为一列?

我有这张桌子:

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的新行副本。

2 个答案:

答案 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

通过将IDD用作id_vars,对于所有其他变量(AB和{{ 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

与您想要的结果相比,还有一个附加的(索引)列, 但我认为这并不重要。