Pandas基于值的数据框架组合

时间:2018-02-13 19:41:23

标签: python pandas

我有一个包含13列的pandas数据帧 - ID(唯一标识符),A1,A2,... A12。 所有A列可以有2个值 - 0或1

 d = {'ID': ['ID1', 'ID2','ID3', 'ID4'], 'A1': [0,0,0,1], 'A2': [1,0,0,1], 'A3': [0,0,0,0], 'A4': [1,1,0,1], 'A5': [0,0,0,1]
    , 'A6': [0,1,0,0], 'A7': [1,1,0,1], 'A8': [1,0,0,0], 'A9': [1,1,0,1], 'A10': [0,1,0,0], 'A11': [1,1,1,0], 'A12': [1,0,1,1]}
df = pd.DataFrame(data=d)
df

我想添加一个新列A_combined,其值为12个其他列的组合,如果它们的值为1。 例如,如果行是

ID1 1 0 0 0 0 1 0 0 1 0 1 0 

然后A_combined将具有值A1_A6_A9_A11

任何帮助都将受到高度赞赏!

更新

我能够使用@wen的建议实现数据帧的重组:

import numpy as np

v=df.iloc[:,:12]

test=v.mul(v).replace(0,np.nan).stack().reset_index()

test

在这里'测试'在行级具有列名称。关于按行索引组合行值的后续步骤的任何建议? 谢谢!

3 个答案:

答案 0 :(得分:1)

v=dd.iloc[:,1:]
dd['Acombine']=v.mul(v.columns).replace('',np.nan).stack().groupby(level=0).apply('_'.join)
dd
Out[859]: 
    ID  A1  A2  A3  A12 Acombine
0  ID1   0   0   1    1   A3_A12

答案 1 :(得分:1)

不确定我是否完全关注你的例子(即“其他12个列的组合,如果它们的值为1”,如果是1,那么第一列?)。

ipady

此代码如下所示:如果列'A1'等于1,则使用列A1​​,A2和A3中的值创建并填充列'A_'。可以修改代码的最右边部分以包括所有12列。

答案 2 :(得分:0)

我相信下面的答案是您正在寻找的,而无需重新构建数据。它使用了  将实例1替换为您想要的colum头的临时数据帧。然后,它会创建一个新列,并根据需要将每行中的值连接起来,并添加回原始数据框。

df2 = pd.DataFrame()
for col in df.columns:
    df2[col] = df[col].replace(1, col)

def func(x):
    return '_'.join(str(i) for i in x if i != 0)

df.assign(combined = df2.apply(func, axis=1))

    A1  A10 A11 A12 A2  A3  A4  A5  A6  A7  A8  A9  combined
0   0   0   1   1   1   0   1   0   0   1   1   1   A11_A12_A2_A4_A7_A8_A9
1   0   1   1   0   0   0   1   0   1   1   0   1   A10_A11_A4_A6_A7_A9
2   0   0   1   1   0   0   0   0   0   0   0   0   A11_A12
3   1   0   0   1   1   0   1   1   0   1   0   1   A1_A12_A2_A4_A5_A7_A9