2017-07-03 68 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