问题:有条件替换熊猫
我有一个DataFrame,我想用超过零的值替换特定列中的值。我以为这是实现此目标的一种方式:
df[df.my_channel > 20000].my_channel = 0
如果将通道复制到新的数据框中,这很简单:
df2 = df.my_channel
df2[df2 > 20000] = 0
这完全符合我的要求,但似乎无法与通道一起用作原始DataFrame的一部分。
回答 0
.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的基于整数类型的布尔索引不可用。
回答 1
回答 2
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
原始数据框不更新的原因是,链接索引可能会导致您修改副本而不是数据框的视图。该文档提供了以下建议:
在熊猫对象中设置值时,必须注意避免所谓的链接索引。
您有几种选择:-
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
我会用lambda
一个函数Series
的DataFrame
是这样的:
f = lambda x: 0 if x>100 else 1
df['my_column'] = df['my_column'].map(f)
我没有断言这是一种有效的方法,但是效果很好。
回答 5
试试这个:
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)