有条件的替换熊猫

时间:2014-02-06 16:16:54

标签: python replace pandas conditional

我可能做了一件非常愚蠢的事,但我很难过。

我有一个数据框,我想替换特定列中超过零值的值。我原以为这是实现这个目标的一种方式:

df[df.my_channel > 20000].my_channel = 0

如果我将频道复制到新的数据框中,那很简单:

df2 = df.my_channel 

df2[df2 > 20000] = 0

这正是我想要的,但似乎不能将频道作为原始数据帧的一部分。

6 个答案:

答案 0 :(得分:117)

.ix索引器适用于0.20.0之前的pandas版本,但由于pandas为0.20.0,.ix索引器为deprecated,因此您应该避免使用它。相反,您可以使用.lociloc索引器。您可以通过以下方式解决此问题:

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 > 20000True的行,而df.loc[mask, column_name] = 0将值0设置为mask所在的所选行名称为column_name的列。

<强>更新 在这种情况下,您应该使用loc,因为如果您使用iloc,则会得到NotImplementedError告诉您基于整数类型的基于iLocation的布尔索引不可用

答案 1 :(得分:67)

尝试

df.loc[df.my_channel > 20000, 'my_channel'] = 0

注意:自v0.20.0起,ix has been deprecated赞成loc / iloc

答案 2 :(得分:19)

np.where函数的工作原理如下:

df['X'] = np.where(df['Y']>=50, 'yes', 'no')

在您的情况下,您需要:

import numpy as np
df['my_channel'] = np.where(df.my_channel > 20000, 0, df.my_channel)

答案 3 :(得分:10)

原始数据框未更新的原因是chained indexing可能会导致您修改副本而不是数据框视图。 docs给出以下建议:

  

在熊猫对象中设置值时,必须注意避免   所谓的链式索引。

您有几种选择:-

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'])

答案 4 :(得分:0)

尝试一下:

df.my_channel = df.my_channel.where(df.my_channel <= 20000, other= 0)

df.my_channel = df.my_channel.mask(df.my_channel > 20000, other= 0)

答案 5 :(得分:-1)

我会在lambda的{​​{1}}上使用Series函数,如下所示:

DataFrame

我没有断言这是一种有效的方法,但是效果很好。