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