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

时间:2020-07-10 18:25:08

标签: python pandas

我有一个包含三列的数据框:SubchannelCampaignID

Subchannel     Campaign       ID
PROMO          FLASHSALES     X123
PROMO          PERCENTOFF     Y123

如果子通道以"PRO"开头,我想编写一个python代码,则应在数据帧EML_LOOKUP中创建一个与列ID相同的新列。下面是我正在尝试的代码,但是它不起作用。请帮助。

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

3 个答案:

答案 0 :(得分:1)

您可以使用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)

我们得到以下输出:

  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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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