我有一个包含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
在这里'测试'在行级具有列名称。关于按行索引组合行值的后续步骤的任何建议? 谢谢!
答案 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