Pandas:根据布尔条件更改多列中的值

时间:2015-07-31 13:32:38

标签: python pandas

这应该是一件简单的事情,但不知怎的,我无法围绕在熊猫中选择和掩盖事物的所有不同方式。

因此,对于大数据帧(从csv文件读入),我想根据某些布尔条件更改列列表的值(在相同的选定列上测试)。

我已经尝试了类似的东西,由于尺寸不匹配而无法正常工作:

df.loc[df[my_cols]>0, my_cols] = 1

这也不起作用(因为我试图改变我认为错误列中的值):

df[df[my_cols]>0] = 1

这不起作用,因为我只更改了数据帧的副本:

df[my_cols][df[my_cols]>0] = 1

以下是df.info的输出:

Int64Index: 186171 entries, 0 to 186170
Columns: 737 entries, id to 733:zorg
dtypes: float64(734), int64(1), object(2)
memory usage: 1.0+ GB

一些更高级的Pandas用户可以提供帮助吗?谢谢。

3 个答案:

答案 0 :(得分:1)

所以这就是我最终得到了预期的结果,但我觉得必须有更多的熊猫式解决方案来完成这项任务。

for col in my_cols:
    df.loc[df[col]>0, col] = 1 

答案 1 :(得分:0)

我非常确定有更优雅的方式,但这应该有效:

df = pd.DataFrame(np.random.randint(5, size=(3,4)), columns = ['a','b','c','d'])
mycols =['a','b']
cols_tochange = df.columns[df[mycols].all()>1]
df.loc[:,cols_tochange]  = 1

注意使用all()来获取整个列的条件

答案 2 :(得分:0)

尝试pandas.DataFrame.where

  

返回与self相同形状的对象及其对应的条目   来自于自我,其中cond是真的,否则来自其他。

在你的情况下,这将成为:

df[my_cols] = df[my_cols].where(~(df[my_cols]>0),other=1)