2017-06-15 121 views
1

我有一個df與一些二進制列(1,-1)和一個列表與N列名。 我需要創建這樣一個新的變量...Python熊貓DF創建基於列列表的新變量

DF [ '測試'] = np.where(((DF [ 'Col1中'] == - 1)&(DF [ 'col2的' ] == - 1)),-1,0)

...但是是動態的。所以規則是:如果列表中的所有列具有相同的值(1,-1),那麼採用它。否則值= 0.列表的長度不固定。我可以簡單地遍歷列表並創建「where-String」,還是有更優雅的方式?

謝謝! è

回答

1

IIUC你可以做

df['test'] = np.where((df[list_of_col_names] == -1).all(axis=1), -1, 0) 

所以在這裏你可以通過從原稿DF興趣子選擇的cols的列表,你正在做的是比較感興趣的所有的cols到標量值,然後執行all(axis=1)以測試所有行值是否與該值匹配,並像前面一樣將布爾掩碼傳遞給np.where

如:

list_of_col_names = ['col1','col2'] 
df['test'] = np.where((df[list_of_col_names] == -1).all(axis=1), -1, 0) 

這是你通過名稱或可迭代的實際列表,如果你這樣做,它會提高一個重要KeyError

df['test'] = np.where((df['col1','col2'] == -1).all(axis=1), -1, 0) 

,因爲它會將此解釋爲一個元組,很可能這個列'col1','col2'不存在

+0

非常感謝。但我認爲你有太多的括號:df ['test'] = np.where((df [list_of_col_names] == -1).all(axis = 1),-1,0) – Ele

+0

@Ele這只是強調你應該通過一個列表而不是一串名字:''df [[col1','col2']]''而不是'df ['col1','col2']''人們評論說,它不是由於後者,我會編輯並使其更清晰 – EdChum

+0

很酷,非常感謝! – Ele

相關問題