2017-06-15 123 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

相关问题