计算来自另一列的数据框列中的值,但仅限于满足第3列中的条件

时间:2017-10-17 23:55:58

标签: python pandas

当我这样做时:

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中条件为真的行中?

谢谢!

1 个答案:

答案 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}}