2017-07-03 59 views
1

我有一个表如下列名:熊猫:串联取决于价值

a b c d e 
r1 0 1 0 1 0 
r2 1 1 0 0 0 

我想创建一个F列是列名的串联仅当行有1

So [r1,f] = bd and [r2,f] = ab 

有没有人有一个想法,如何做到这一点熊猫?将不胜感激任何帮助!

+0

数据帧中只有“0”和“1”的值,还是不是? – jezrael

回答

1

您可以通过df通过mul使用多个列的名称,然后sum - 但在df是被转换到True S和False小号01值:

df['f'] = df.mul(df.columns.values).sum(axis=1) 
print (df) 
    a b c d e f 
r1 0 1 0 1 0 bd 
r2 1 1 0 0 0 ab 

通用的解决方案(如果有更多的可能值作为0,1):

eq1比较:

df['f'] = df.eq(1).mul(df.columns.values).sum(axis=1) 
print (df) 
    a b c d e f 
r1 0 1 0 1 0 bd 
r2 1 1 0 0 0 ab 

doteq

df['f'] = df.eq(1).dot(df.columns.values) 
print (df) 
    a b c d e f 
r1 0 1 0 1 0 bd 
r2 1 1 0 0 0 ab 

apply另一种解决方案是slowier:

df['f'] = df.apply(lambda x: ''.join(x.index[x == 1]), axis=1) 
print (df) 
    a b c d e f 
r1 0 1 0 1 0 bd 
r2 1 1 0 0 0 ab 

编辑:

对于添加空间是可能的用途:

df['f'] = df['f'].apply(lambda x: ' '.join(list(x))) 
print (df) 
    a b c d e f 
r1 0 1 0 1 0 b d 
r2 1 1 0 0 0 a b 
+0

哇,太神奇了!非常感谢!如何在两者之间加入空格?喜欢而不是bd,显示“b d”? – tlhy

+0

嗯,那么需要'df ['f'] = df.apply(lambda x:''.join(x.index [x == 1]),axis = 1)' – jezrael

+0

@piRSquared - 。但很简单,它取决于数据。如果只有'0,1',是不是必需的。 – jezrael