Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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 在熊猫数据帧上应用IF条件_Python_Pandas - Fatal编程技术网

Python 在熊猫数据帧上应用IF条件

Python 在熊猫数据帧上应用IF条件,python,pandas,Python,Pandas,我有一个包含三列的数据框:子频道,活动和ID Subchannel Campaign ID PROMO FLASHSALES X123 PROMO PERCENTOFF Y123 我想写一个python代码,如果子通道以“PRO”开头,那么应该在数据帧EML\u查找中创建一个新列,其值与列ID相同。下面是我尝试的代码,但它不起作用。请帮忙 if EML_LOOKUP['Subchannel'].str.startswit

我有一个包含三列的数据框:
子频道
活动
ID

Subchannel     Campaign       ID
PROMO          FLASHSALES     X123
PROMO          PERCENTOFF     Y123
我想写一个python代码,如果子通道以
“PRO”
开头,那么应该在数据帧
EML\u查找
中创建一个新列,其值与列
ID
相同。下面是我尝试的代码,但它不起作用。请帮忙

if  EML_LOOKUP['Subchannel'].str.startswith("PRO"):
   EML_LOOKUP['New_Column'] = EML_LOOKUP['ID']
您可以使用
np.where()
,它以矢量化的方式工作,比
apply()
更快:

在本例中,如果子通道不是以PRO开头,我们将用
NaN
填充新列,否则,我们将设置ID值

下面是一个完整的工作示例:

EML_LOOKUP = pd.DataFrame({'Subchannel':['PROMO','PROMO','NOT PROMO'],
                   'Campaign':['FALSHSALES','PERCENTOFF','REGULAR'],
                   'ID':['X123','Y123','Z123']})

  Subchannel    Campaign    ID
0      PROMO  FALSHSALES  X123
1      PROMO  PERCENTOFF  Y123
2  NOT PROMO     REGULAR  Z123
应用建议的解决方案后:

EML_LOOKUP['New_Column'] = np.where(EML_LOOKUP['Subchannel'].str.startswith("PRO"),EML_LOOKUP['ID'],np.nan)
我们得到这个输出:

  Subchannel    Campaign    ID New_Column
0      PROMO  FALSHSALES  X123       X123
1      PROMO  PERCENTOFF  Y123       Y123
2  NOT PROMO     REGULAR  Z123        NaN
如果存在多个条件,我们可以根据我们希望使用的逻辑,使用括号分隔并通过布尔运算符
&
|
将它们相加:

EML_LOOKUP = pd.DataFrame({'Subchannel':['PROMO','PROMO','NOT PROMO'],
                       'Campaign':['FALSHSALES','PERCENTOFF','REGULAR'],
                       'ID':['X123','Y123','Z123'],
                       'Campaign':[10,3,20]})
EML_LOOKUP['New_Column'] = np.where((EML_LOOKUP['Subchannel'].str.startswith("PRO")) & 
                                    (EML_LOOKUP['Campaign'] > 5),
                                    EML_LOOKUP['ID'],np.nan)
输出:

  Subchannel  Campaign    ID New_Column
0      PROMO        10  X123       X123
1      PROMO         3  Y123        NaN
2  NOT PROMO        20  Z123        NaN

使用
str.startswith
进行布尔索引:

EML_LOOKUP['New_Column'] = EML_LOOKUP['ID'][EML_LOOKUP['Subchannel'].str.startswith('PRO')]

df['New']=df['ID'].where(df['Subchannel'].str.startswith('PRO'))
非常感谢您。成功了。非常感谢您的意见。如果您的问题得到解决,请随时接受我的回答!这也有助于提高我的声誉:)!Hi Celius Stinger-如果存在多个条件,例如子通道以Pro开始,活动长度>5,我将如何使用np.where条件?请告知。您需要在括号之间声明每个条件,并使用布尔运算符
&
。让我来编辑答案这非常有帮助。你太棒了。如果您不介意的话,请您也回答一下,如果我必须基于相同的条件创建两个不同的新列并为其赋值,是否可以通过np.where?Hi-Vinod-使用.loc有什么帮助?这是否意味着适用于所有行?您能否解释一下这是如何解决问题的,或者这段代码的作用是什么?loc通过标签或布尔数组将数据帧过滤为一组行和列。如果条件为
True
,它将拾取该行。如果条件
EML_LOOKUP['Subchannel'].str.startswith(“PRO”)
True
,则假设对于特定行,该行被选中,并且对所有行都是类似的。现在,对于所选行组,我们已将
ID
列复制到
New\u列
,复制仅适用于所选行,对于
New\u列
的未选择行,值将设置为
NaN
。这是一个非常有用的解释。我尝试了这个解决方案-得到了一个错误-ValueError:无法使用包含NA/NaN值的向量进行索引。我应该用字符串替换Na值吗?@Newbie123你能告诉我你的代码行是在哪里出错的吗。谢谢汤姆。这行代码给出了一个错误:错误是:ValueError:无法使用包含NA/NaN的向量进行索引values@Newbie123那一定还有别的事。使用Celius回答中的示例数据帧,这对我来说很有用。但是,它没有做多条件的事情(从你对Celius的评论来看),但是它可以被修改toOkay,谢谢你关注这个问题。我会用你的逻辑再试一次。也许我的数据有问题。我掌握的数据不是很清楚。
EML_LOOKUP['New_Column'] = EML_LOOKUP['ID'][EML_LOOKUP['Subchannel'].str.startswith('PRO')]
EML_LOOKUP['New_Column'] = EML_LOOKUP.loc[EML_LOOKUP['Subchannel'].str.startswith("PRO")].ID