Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有条件替换熊猫_Python_Pandas_Replace_Conditional Statements_Series - Fatal编程技术网

Python 有条件替换熊猫

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

我有一个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

注意:从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)
。我不知道它是否像您在下面添加的那样快。不,仍然很慢,因为您仍然在按行而不是按列操作。