我可能做了一件非常愚蠢的事,但我很难过。
我有一个数据框,我想替换特定列中超过零值的值。我原以为这是实现这个目标的一种方式:
df[df.my_channel > 20000].my_channel = 0
如果我将频道复制到新的数据框中,那很简单:
df2 = df.my_channel
df2[df2 > 20000] = 0
这正是我想要的,但似乎不能将频道作为原始数据帧的一部分。
答案 0 :(得分:117)
.ix
索引器适用于0.20.0之前的pandas版本,但由于pandas为0.20.0,.ix
索引器为deprecated,因此您应该避免使用它。相反,您可以使用.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的布尔索引不可用
答案 1 :(得分:67)
答案 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
我没有断言这是一种有效的方法,但是效果很好。