我有一个包含一些二进制列 (1,-1) 的 df 和一个包含 N 个列名的列表。 我需要创建一个像这样的新变量...
df['test'] = np.where(((df['Col1']==-1) & (df['Col2']==-1)), -1, 0)
...但是是动态的。所以规则是:如果列表中的所有列都具有相同的值 (1,-1),则采用它。否则值= 0。列表的长度不固定。我可以简单地迭代列表并创建“where-String”还是有更优雅的方法?
谢谢!
最佳答案
IIUC 你可以做
df['test'] = np.where((df[list_of_col_names] == -1).all(axis=1), -1, 0)
因此,在这里您只需传递感兴趣的列列表即可从原始 df 中进行子选择,因为您所做的就是将所有感兴趣的列与标量值进行比较,然后执行 all(axis= 1)
测试所有行值是否与该值匹配,并像以前一样将 bool 掩码传递给 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'
可能不存在
关于Python Pandas DF 根据列列表创建新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44563667/