我有一个包含三列的数据框:Subchannel
,Campaign
和ID
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']
答案 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