Python Dataframe:使用If-Then-Else逻辑有条件地创建新列-->&引用;级数的真值是模糊的;
我正在使用下面的代码创建一个新列,该列的值是基于Python数据框架的另外两列中的值派生的Python Dataframe:使用If-Then-Else逻辑有条件地创建新列-->&引用;级数的真值是模糊的;,python,pandas,if-statement,conditional,ambiguous,Python,Pandas,If Statement,Conditional,Ambiguous,我正在使用下面的代码创建一个新列,该列的值是基于Python数据框架的另外两列中的值派生的 # Create a list to store the data MSP = [] for row in df_EVENT5_18['FLT']: if df_EVENT5_18['FLT'].str.contains('1234') & df_EVENT5_18['AR'].str.contains('ABC1'): MSP.append(29) elif (
# Create a list to store the data
MSP = []
for row in df_EVENT5_18['FLT']:
if df_EVENT5_18['FLT'].str.contains('1234') & df_EVENT5_18['AR'].str.contains('ABC1'):
MSP.append(29)
elif (df_EVENT5_18['FLT'].str.contains('1234')) & (df_EVENT5_18['AR'].str.contains('ABC2')):
MSP.append(25)
else:
MSP.append('')
# Create a new column from the list
df_EVENT5_18['MSP'] = MSP
当我运行上述代码时,我得到以下错误:
ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()
每当您认为需要在pandas中进行循环时,请再次检查您的代码。一个线索是您在df_EVENT5_18['FLT']中有
行:
,但您从未使用行
查找与字符串匹配的标记
在这种情况下,我们可以简单地使用布尔求值来获得我们想要设置的索引:
has_flt_1234 = df_EVENT5_18['FLT'].str.contains('1234')
want_29 = has_flt_1234 & df_EVENT5_18['AR'].str.contains('ABC1')
want_25 = has_flt_1234 & df_EVENT5_18['AR'].str.contains('ABC2')
使用布尔级数设置值
然后根据需要设置适当的行:
df_EVENT5_18['MSP'][want_25] = '25'
df_EVENT5_18['MSP'][want_29] = '29'
测试代码:
结果:
试试这样:
df[['new_col']] = df[['a','b'].apply(lambda (a,b) : pd.Series(your condition here),axis=1)
谢谢你的详细回复。你在这里应用逻辑的方式很有趣。。。如果艾利夫还有别的方法,有没有办法做到这一点?当然有。但不要那样做。这会快得多。
AR FLT
0 ABC1 1234
1 ABC2 1234
2 ABC1 1235
AR FLT MSP
0 ABC1 1234 29
1 ABC2 1234 25
2 ABC1 1235
df[['new_col']] = df[['a','b'].apply(lambda (a,b) : pd.Series(your condition here),axis=1)