首页 > 解决方案 > 熊猫:功能转变:“模棱两可的真值”

问题描述

我有一个由 dateIndex 和 price 列组成的数据框,如下所示:

DATE   |     PRICE
01-01-2018    100
02-01-2018    101
03-01-2018    97

我编写了一个函数来计算连续价格与之前 3 行(“天”)的价格之间的差异。(我知道还有其他的 pandas 方法可以实现这一点,但是这个函数是一个存根,我想稍后扩展)

def case1(x):

  prevrow = x.shift(3)
  if np.isnan(prevrow['price']):
      pass
  else:
      if x['price'] > prevrow['price']:
          diff = prevrow['price'] - x['price']             
          print('The diff is {}').format(diff)

但是,当我尝试运行 ( case1(df)) 这个函数时,我遇到了

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

错误。它似乎是NaN在函数开头移位生成的 3 个值上触发的。但是添加对NaN值的检查仍然会导致相同的错误消息。

有谁知道我做错了什么?

标签: pythonpandas

解决方案


让我们考虑一个更大的数据框以获得更好的可视化:

DATE        |  price
01-01-2018     100
02-01-2018     101
03-01-2018     97
04-01-2018     102
05-01-2018     100
06-01-2018     107
07-01-2018     38

您的代码中有一些问题。您正在尝试使用数组而不是单个值进行布尔运算。一个解法:

def case1(x):
    # New df with a new column for shift prices
    df = x.assign(price_prevrow= x.shift(3)['price'])

    if np.isnan(df['price_prevrow']).all(): # Check ALL values
        pass
    else:
        # Slice df to get only rows with price greater than price_prevrow
        df = df.loc[df['price'] > df['price_prevrow']]

        # Calculate difference
        diff = df['price_prevrow'] - df['price']

        # Print all differences
        for d in diff:
            print('The diff is {}'.format(d))

上面的代码创建了一个新的数据框,其中包含了价格变化后的价格,然后将该数据框分割为价格值大于 prevrow 值的行。在此之后,差异很容易。

输出:

"The diff is -2.0"
"The diff is -10.0"

推荐阅读