Pandas应用ValueError:系列的真值是暧昧的

时间:2018-01-26 11:14:06

标签: python pandas

我正在尝试使用

创建新功能
df_transactions['emome'] = df_transactions['emome'].apply(lambda x: 1 if df_transactions['plan_list_price'] ==0 & df_transactions['actual_amount_paid'] > 0 else 0).astype(int)

但它引发了错误

  

ValueError:系列的真值是不明确的。使用a.empty,   a.bool(),a.item(),a.any()或a.all()。

当plan_list_price为0且actual_amount_paid为> 0时,如何创建一个返回1的新列?

我还想使用pandas apply。

2 个答案:

答案 0 :(得分:1)

你真的很接近,但更好的是没有pip3 install --upgrade image的矢量化解决方案 - 得到布尔掩码并转换为apply

int

如果真的想要更慢mask = (df_transactions['plan_list_price'] == 0) & (df_transactions['actual_amount_paid'] > 0) df_transactions['emome'] = mask.astype(int)

apply

样品:

f = lambda x: 1 if x['plan_list_price'] ==0 and x['actual_amount_paid'] > 0 else 0
df_transactions['emome'] = df_transactions.apply(f, axis=1)

<强>计时

df_transactions = pd.DataFrame({'A':list('abcdef'),
                                'plan_list_price':[0,0,0,5,5,0],
                                'actual_amount_paid':[-1,0,9,4,2,3]})


mask = (df_transactions['plan_list_price'] == 0) & \
       (df_transactions['actual_amount_paid'] > 0)
df_transactions['emome1'] = mask.astype(int)

f = lambda x: 1 if x['plan_list_price'] ==0 and x['actual_amount_paid'] > 0 else 0
df_transactions['emome2'] = df_transactions.apply(f, axis=1)
print (df_transactions)

   A  actual_amount_paid  plan_list_price  emome1  emome2
0  a                  -1                0       0       0
1  b                   0                0       0       0
2  c                   9                0       1       1
3  d                   4                5       0       0
4  e                   2                5       0       0
5  f                   3                0       1       1

答案 1 :(得分:0)

一些问题:

  • 在等式的右边,新字段(表情)不是 创建了。
  • lambda函数位于x上,而不位于df_transactions上,该函数在此范围中不存在。
  • 您需要指定轴,因为您要应用到每一行(默认是每一列)。

来自文档:

  

轴:{0或'index',1或'columns'},默认为0,   功能已应用:

     

0或“索引”:将功能应用于每一列。 1个或“列”:应用   对每一行起作用。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html