ValueError:DataFrame 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()

数据挖掘 Python 熊猫 数据框
2021-10-05 01:43:13

首先我有一个熊猫系列的推荐产品(recmd_prdt_list)。在本系列中,可能存在已删除的产品。为了从推荐产品中删除已删除的产品,我执行了以下操作:

recmd_prdt_list = user_lookup['Recommended items']
recmd_prdt_list

0 PLV08、PLPD04、PBC07、555、PLF02、963、PLF07、...

1 123、345、R922、华硕009、AIMAC、Th001、SAM S9、...

2 LGRFG、LG、1025、COFMH、8048、BY7、PLHL4、569、...

3 COFMH、5454、8048、1025、LG、len123、Th001、PL...

4 LGRFG, AIM-Pro, 569, Asus009, PLHL3, PL04, PLH...

5 PLV08、PLF09、PLF02、PBC04、PLF07、AIM-Pro、PL...

type(recmd_prdt_list)

pandas.core.series.Series

产品状态DataFrame

product_status
ItemCode  Status DeletedStatus
AIMAC     2      True
AIM-Pro   2      True
SAM S9    2      True
SH MV     2      True
COFMH     2      True
LGRFG     2      True
type(product_status)

pandas.core.frame.DataFrame

first_row = user_lookup['Recommended items'][0]
first_row

'PLV08、PLPD04、PBC07、555、PLF02、963、PLF07、HG8、嫉妒21、4'

type(first_row)

字符串

将 str 转换为列表

first_row_list = list(first_row .split(","))
first_row_list

['PLV08'、'PLPD04'、'PBC07'、'555'、'PLF02'、'963'、'PLF07'、'HG8'、'嫉妒21'、'4']

从第一行开始,我使用第一个 itemcode 来检查已删除的状态:

product_details = product_status.loc[product_status['ItemCode'] == 'PLV08']
product_details
ItemCode   Status   DeletedStatus  

PLV08       2            False
type(product_details)

pandas.core.frame.DataFrame

product_details['DeletedStatus']

693 假的

名称:DeletedStatus,数据类型:bool

以便检查相应行中每个产品的删除状态并保存到新列表中。我写了以下代码:

itemcode = 'PLV08'
activ_product = []
if itemcode in product_status['ItemCode'].values:
    print(itemcode)
    product_details = product_status.loc[product_status['ItemCode'] == itemcode]
    print(product_details)
    if product_details['Status'] == 2 & product_details['DeletedStatus'] == 'False':
        activ_product.append(itemcode)

错误 :

PLV08
     ClientId ItemCode  Status  DeletedStatus
499      2213    PLV08       2          False
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-35-9507e1ada5f7> in <module>()
      5     product_details = product_status.loc[product_status['ItemCode'] == itemcode]
      6     print(product_details)
----> 7     if product_details['Status'] == 2 & product_details['DeletedStatus'] == 'False':
      8         activ_product.append(itemcode)

~/.virtualenvs/sysg_python3/lib/python3.5/site-packages/pandas/core/generic.py in __nonzero__(self)
    951         raise ValueError("The truth value of a {0} is ambiguous. "
    952                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
--> 953                          .format(self.__class__.__name__))
    954 
    955     __bool__ = __nonzero__

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

如何解决这个错误?

1个回答

首先,要在 Python 中进行逻辑测试,您不应该&对单个值使用等式(参见this),并且不应该在布尔值FalseTrue.

现在,关于你的具体错误:写作时product_details['Status']product_details['DeletedStatus']每次都会得到 a Series,你无法测试and它们之间的逻辑。如果您有唯一的商品代码,您可以使用:

if product_details.iloc[0]['Status'] == 2 and product_details.iloc[0]['DeletedStatus'] == False:
    activ_product.append(itemcode)

它只会选择product_details所需列的第一行并将其子集化,以便结果是单个值,您可以对其进行比较。