多个 if 条件熊猫

时间:2021-05-22 20:12:16

标签: python pandas dataframe

希望编写一个 if 语句,该语句根据数据帧中其他列的 3 个条件是否为真进行计算。我已经尝试了下面的代码,它似乎对 stackoverflow 上的其他人有效,但对我来说却是一个错误。请注意,“check”、“sqm”和“sqft”列采用 float64 格式。

if ((merge['check'] == 1) & (merge['sqft'] > 0) & (merge['sqm'] == 0)):
         merge['checksqm'] == merge['sqft']/10.7639

#错误如下:


alueError                                Traceback (most recent call last)
<ipython-input-383-e84717fde2c0> in <module>
----> 1 if ((merge['check'] == 1) & (merge['sqft'] > 0) & (merge['sqm'] == 0)):
      2          merge['checksqm'] == merge['sqft']/10.7639

~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in __nonzero__(self)
   1327 
   1328     def __nonzero__(self):
-> 1329         raise ValueError(
   1330             f"The truth value of a {type(self).__name__} is ambiguous. "
   1331             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

2 个答案:

答案 0 :(得分:1)

您编码的每个条件都会评估为一系列多个布尔值。 3 个条件的组合结果也成为布尔系列。 Python if 语句无法处理这样的 Pandas 系列,它评估系列中的每个元素并逐一提供给它后面的语句。因此,错误 ValueError: The truth value of a Series is ambiguous.

要解决这个问题,您必须使用 Pandas 语法对其进行编码,如下所示:

mask = (merge['check'] == 1) & (merge['sqft'] > 0) & (merge['sqm'] == 0)
merge.loc[mask, 'checksqm'] = merge['sqft']/10.7639

或者,组合成一个语句,如下所示:

merge.loc[(merge['check'] == 1) & (merge['sqft'] > 0) & (merge['sqm'] == 0), 'checksqm'] = merge['sqft']/10.7639

这样,Pandas 就可以对布尔序列进行求值,并对组合 3 个条件的 True 值对应的行进行处理,并对每一行进行处理,从每一行中取出相应的值进行处理。这种场景下的向量化操作是普通的Python语句如if语句所不支持的。

答案 1 :(得分:0)

您正在尝试使用 pd.Series 作为 if 子句中的条件。该系列是 TrueFalse 值的掩码。您需要使用 boolseries.any() 将系列投射到 series.all()