Python 有条件替换熊猫
我有一个DataFrame,我想用零替换特定列中超过某个值的值。我认为这是实现这一目标的一种方式:Python 有条件替换熊猫,python,pandas,replace,conditional-statements,series,Python,Pandas,Replace,Conditional Statements,Series,我有一个DataFrame,我想用零替换特定列中超过某个值的值。我认为这是实现这一目标的一种方式: df[df.my_channel > 20000].my_channel = 0 如果我将通道复制到一个新的数据帧中,很简单: df2 = df.my_channel df2[df2 > 20000] = 0 这正是我想要的,但似乎无法将通道作为原始数据帧的一部分使用。试试看 df.loc[df.my_channel > 20000, 'my_channel'] = 0
df[df.my_channel > 20000].my_channel = 0
如果我将通道复制到一个新的数据帧中,很简单:
df2 = df.my_channel
df2[df2 > 20000] = 0
这正是我想要的,但似乎无法将通道作为原始数据帧的一部分使用。试试看
df.loc[df.my_channel > 20000, 'my_channel'] = 0
注意:从v0.20.0开始,
ix
支持loc
/iloc
.ix
索引器适用于0.20.0之前的pandas版本,但是由于pandas 0.20.0,因此.ix
索引器是可用的,因此您应该避免使用它。相反,您可以使用.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布尔索引不可用。函数的工作原理如下:
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)
我会在
数据帧的系列上使用lambda
函数,如下所示:
f = lambda x: 0 if x>100 else 1
df['my_column'] = df['my_column'].map(f)
我不认为这是一种有效的方法,但它很有效 原始数据帧未更新的原因是,可能会导致您修改数据帧的副本而不是视图。政府建议:
在对象中设置值时,必须注意避免
所谓链式索引
你有几个选择:-
+布尔索引
loc
可用于设置值并支持布尔掩码:
df.loc[df['my_channel'] > 20000, 'my_channel'] = 0
+布尔索引
您可以为系列分配:
df['my_channel'] = df['my_channel'].mask(df['my_channel'] > 20000, 0)
或者,您可以就地更新系列:
df['my_channel'].mask(df['my_channel'] > 20000, 0, inplace=True)
+布尔索引
当您的条件不满足时,您可以通过指定原始序列来使用NumPy;但是,前两个解决方案更干净,因为它们只显式更改指定的值
df['my_channel'] = np.where(df['my_channel'] > 20000, 0, df['my_channel'])
试试这个:
df.my_channel=df.my_channel.where(df.my_channel 20000,other=0)
谢谢。我也找到了自己的解决方案,那就是:df.my_channel[df.my_channel>20000]=0@BMichell我认为您的解决方案可能会在0.13中开始向您发出警告,没有机会尝试yetyield error:/opt/anaconda3/envs/python35/lib/python3.5/site packages/ipykernel_launcher.py:1:SettingWithCopyWarning:试图在数据帧的切片副本上设置值请参阅文档中的注意事项:““启动IPython内核的入口点。@RutgerHofste感谢您提到这一点,但另一个参数从未使用Python3。我认为您正在寻找的是它。这是低效的,不推荐使用,因为它涉及到行操作中的Python级循环。谢谢,我想我们可以在这里使用loc
,比如df.loc[:,'my_column']=df['my_column'].map(f)
。我不知道它是否像您在下面添加的那样快。不,仍然很慢,因为您仍然在按行而不是按列操作。