这应该是一件简单的事情,但不知怎的,我无法围绕在熊猫中选择和掩盖事物的所有不同方式。
因此,对于大数据帧(从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用户可以提供帮助吗?谢谢。
答案 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)