ValueError:DataFrame的真值是不明确的

时间:2018-01-27 22:31:30

标签: python python-3.x pandas

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

        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().

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

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

2 个答案:

答案 0 :(得分:1)

这可能就是你要找的东西。您可能需要阅读Indexing and Selecting Data。我只需在开头设置默认值0即可设置默认值。

您出错的原因是您尝试进行逐行(向量化计算),但实际上在您的函数diff() ratings[ratings.downloaded > 0]中返回数据帧的一个子集并在其前面{ {1}}含糊不清。错误消息反映了这一点。

if

答案 1 :(得分:0)

Dataframe对象不会转换为布尔值,请更改条件

if ratings[ratings.downloaded > 0]:

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