Answers:
.ix
indexer可以在0.20.0之前的熊猫版本上正常工作,但是由于pandas为0.20.0 ,因此不推荐使用.ix
indexer ,因此应避免使用它。而是可以使用或索引器。您可以通过以下方法解决此问题:.loc
iloc
mask = df.my_channel > 20000
column_name = 'my_channel'
df.loc[mask, column_name] = 0
或者,一行
df.loc[df.my_channel > 20000, 'my_channel'] = 0
mask
帮助您选择这些行df.my_channel > 20000
为True
,而df.loc[mask, column_name] = 0
将值0到所选择的行,其中mask
在其名称是列存放column_name
。
更新:
在这种情况下,应该使用,loc
因为如果使用iloc
,则会NotImplementedError
告诉您基于iLocation的基于整数类型的布尔索引不可用。
原始数据框不更新的原因是,链接索引可能会导致您修改副本而不是数据框的视图。该文档提供了以下建议:
在熊猫对象中设置值时,必须注意避免所谓的链接索引。
您有几种选择:-
loc
+布尔索引loc
可以用于设置值并支持布尔掩码:
df.loc[df['my_channel'] > 20000, 'my_channel'] = 0
mask
+布尔索引您可以分配给您的系列:
df['my_channel'] = df['my_channel'].mask(df['my_channel'] > 20000, 0)
或者,您可以就地更新系列:
df['my_channel'].mask(df['my_channel'] > 20000, 0, inplace=True)
np.where
+布尔索引您可以通过分配当你的条件原系列使用NumPy的未满足的; 但是,前两种解决方案更干净,因为它们仅显式更改指定的值。
df['my_channel'] = np.where(df['my_channel'] > 20000, 0, df['my_channel'])
我会用lambda
一个函数Series
的DataFrame
是这样的:
f = lambda x: 0 if x>100 else 1
df['my_column'] = df['my_column'].map(f)
我没有断言这是一种有效的方法,但是效果很好。
loc
在这里使用 ,例如df.loc[: , 'my_column'] = df['my_column'].map(f)
。我不知道它是否像您在下面添加的那样快速。