繁体   English   中英

在熊猫 dataframe 上应用 IF 条件

[英]Applying IF Condition on a panda dataframe

我有一个 dataframe 有三列: SubchannelCampaignID

Subchannel     Campaign       ID
PROMO          FLASHSALES     X123
PROMO          PERCENTOFF     Y123

如果子通道以"PRO"开头,我想编写一个 python 代码,那么应该在 dataframe EML_LOOKUP中创建一个与 Column ID具有相同值的新列。 下面是我正在尝试的代码,但它不起作用。 请帮忙。

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

您可以使用np.where()以矢量化方式工作并且比apply()更快:

import numpy as np 
EML_LOOKUP['New_Column'] = np.where(EML_LOOKUP['Subchannel'].str.startswith("PRO"),EML_LOOKUP['ID'],np.nan)

在此示例中,如果子通道不以 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)

我们得到这个 output:

  Subchannel    Campaign    ID New_Column
0      PROMO  FALSHSALES  X123       X123
1      PROMO  PERCENTOFF  Y123       Y123
2  NOT PROMO     REGULAR  Z123        NaN

如果有多个条件,我们可以使用将它们用括号分隔并由 boolean 运算符&|加入取决于我们希望使用的逻辑:

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)

Output:

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

Boolean 使用您的str.startswith进行索引:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM