【问题标题】:ValueError: The truth value of a DataFrame is ambiguousValueError:DataFrame 的真值不明确
【发布时间】:2018-07-06 23:10:45
【问题描述】:

我有一个如下所示的数据框:

        total   downloaded  avg_rating
id          
1        2      2           5.0
2       12     12           4.5
3        1      1           5.0
4        1      1           4.0
5        0      0           0.0

我正在尝试添加一个新列,其中两个列的百分比差异,但仅适用于“已下载”中没有 0 的列。

我正在尝试使用如下所示的函数:

def diff(ratings):
    if ratings[ratings.downloaded > 0]:
        val = (ratings['total'] - ratings['downloaded']) / ratings['downloaded']
    else:
        val = 0
    return val

ratings['Pct Diff'] = diff(ratings)

我收到一个错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-129-729c09bf14e8> in <module>()
      6     return val
      7 
----> 8 ratings['Pct Diff'] = diff(ratings)

<ipython-input-129-729c09bf14e8> in diff(ratings)
      1 def diff(ratings):
----> 2     if ratings[ratings.downloaded > 0]:
      3         val = (ratings['total'] - ratings['downloaded']) / 
ratings['downloaded']
      4     else:
      5         val = 0

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

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

有人可以帮我理解这个错误的含义吗?

另外,这对于应用功能来说是一个很好的应用程序吗?我可以在申请中使用条件吗?在这种情况下我将如何使用它?

【问题讨论】:

  • 嗯,根据你的说法,if ratings[ratings.downloaded &gt; 0] 什么时候应该是True?如果有 anyTrue,或 all?
  • 您的预期输出是什么样的
  • 如果您提供生成该数据帧的代码会更容易检查
  • @WillemVanOnsem 不确定您所问的确切差异。对于条件为真的每一行,执行计算并放入新列(对于任何为假的,它将除以 0,这是我试图避免的)。
  • @juanpa.arrivillaga 预期的输出是一个包含计算结果的新列。在显示的 5 行的情况下,答案都是 0.0(例如 (2-2)/2 = 0),但对于整个 df 来说并非如此。

标签: python python-3.x pandas valueerror


【解决方案1】:

您的错误的原因是您尝试进行逐行(矢量化计算),但实际上在您的函数中 diff() ratings[ratings.downloaded &gt; 0] 返回数据帧的子集并在其前面加上 if 是不明确的.错误消息反映了这一点。

您不妨查看Indexing and Selecting Data。以下解决方案通过在开头设置默认值0。

import pandas as pd

df = pd.DataFrame([[2, 2, 5.0], [12, 12, 4.5], [10, 5, 3.0],
                   [20, 2, 3.5], [3, 0, 0.0], [0, 0, 0.0]],
                  columns=['total', 'downloaded', 'avg_rating'])

df['Pct Diff'] = 0
df.loc[df['downloaded'] > 0, 'Pct Diff'] = (df['total'] - df['downloaded']) / df['total']

#   total   downloaded  avg_rating  Pct Diff
# 0 2   2   5.0 0.0
# 1 12  12  4.5 0.0
# 2 10  5   3.0 0.5
# 3 20  2   3.5 0.9
# 4 3   0   0.0 0.0
# 5 0   0   0.0 0.0

【讨论】:

    【解决方案2】:

    数据框对象不转换为布尔值,更改条件

    if ratings[ratings.downloaded > 0]:
    

    if len(ratings[ratings.downloaded > 0]) > 0:
    

    【讨论】:

      猜你喜欢
      • 2021-01-19
      • 2017-11-22
      • 1970-01-01
      • 2020-11-14
      • 2021-11-28
      • 2021-07-31
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      相关资源
      最近更新 更多