在Pandas数据帧上应用IF条件

2024-09-28 21:04:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Subchannel     Campaign       ID
PROMO          FLASHSALES     X123
PROMO          PERCENTOFF     Y123

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

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

Tags: 数据代码框架idiflookuppropromo
3条回答

使用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

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

相关问题 更多 >