希望编写一个 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().
答案 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
子句中的条件。该系列是 True
、False
值的掩码。您需要使用 bool
或 series.any()
将系列投射到 series.all()
。