当我这样做时:
import pandas as pd
table={'x':[1,2,3,4,5,1,2,3,4,5,1,2,3,4,5],
'y':[1,1,2,2,2,1,2,3,4,5,1,2,2,2,3],
'z':[0,0,2,2,0,1,2,0,4,5,0,2,0,2,3],
'type':['a','a','a','a','a','b','b','b','b','b','c','c','c','c','c']}
df=pd.DataFrame(table, columns=['x','y','z','type'])
mask = df.z==0
df.x[mask] = 1./df.y[mask]
我得到了理想的行为,但是熊猫抱怨并说:
请参阅文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy df.x [mask] = 1./df.y[mask]
现在,这只是一个小小的df,因此我可以使警告消失,使用iloc或类似行逐行更改列'x'。但是在我的实际数据分析程序中,df更大,因此iloc方法会使事情变慢。
是否有更好的方法来获取列x中的更改,使用列y值,仅在列z中条件为真的行中?
谢谢!
答案 0 :(得分:1)
使用df.loc[mask, 'x'] = 1. / df.loc[mask, 'y']
来避免链索引......以及链索引上的赋值
df.x.values[mask] = 1. / df.y[mask]
那就是说。您可以为要分配的值执行链索引。您只有在链索引后尝试分配给对象的警告....
这也适用
df.loc[mask, 'x'] = 1. / df.y[mask]
以及
{{1}}