【问题标题】:Ambiguous truth value with boolean logic带有布尔逻辑的模棱两可的真值
【发布时间】:2015-03-31 02:24:11
【问题描述】:

我正在尝试在数据帧的函数中使用一些布尔逻辑,但出现错误:

在[4]中:

data={'level':[20,19,20,21,25,29,30,31,30,29,31]}
frame=DataFrame(data)
frame
Out[4]:
level
0   20
1   19
2   20
3   21
4   25
5   29
6   30
7   31
8   30
9   29
10  31

In [35]:

def calculate(x):
    baseline=max(frame['level'],frame['level'].shift(1))#doesnt work
    #baseline=x['level']+4#works
    difftobase=x['level']-baseline
    return baseline, difftobase
frame['baseline'], frame['difftobase'] = zip(*frame.apply(calculate, axis=1))#works

但是,这会引发以下错误:

baseline=max(frame['level'],frame['level'].shift(1))#doesnt work


ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', u'occurred at index 0')

我读过How to look back at previous rows from within Pandas dataframe function call?http://pandas.pydata.org/pandas-docs/stable/gotchas.html 但不知道如何将其应用于我的问题?

【问题讨论】:

  • 您所要求的可以通过使用masking and where()shift来实现
  • 我建议你看看我的 cmets 中的那些链接,尝试一些事情,然后返回数据、代码、预期输出,如果你卡住了任何错误回溯
  • 在收到反对票后,我试图通过删除更大的部分、不必要的绒毛和第二个问题(移至另一个问题)来改进问题。作为本网站的初学者,任何反对投票的建设性 cmets 肯定会受到赞赏!
  • 不,它是一个适当的编辑(希望改进),以及将一部分分离到另一个问题。但我正在考虑删除这个并从头开始重新发布,因为我怀疑一个被否决的问题会得到很大的吸引力。另一方面,删除和转发是否构成“不良行为”?还张贴的 cmets 不再与这个问题相提并论。让我们来看看。也许我会把它放在那里一天,然后重新发布。

标签: python excel algorithm pandas data-analysis


【解决方案1】:

函数 max 的使用不足。 np.maximum (也许 np.ma.max 以及每个 numpy 文档)有效。显然,常规的 max 不能(容易地)处理数组。替换

baseline=max(frame['level'],frame['level'].shift(1))#doesnt work

baseline=np.maximum(frame['level'],frame['level'].shift(1))

成功了。为了便于阅读,我删除了另一部分:

In [23]:
#q 1 analysis
def calculate_rowise(x):
    baseline=np.maximum(frame['level'],frame['level'].shift(1))#works
    return baseline
frame.apply(calculate_rowise)

Out[23]:
level
0   NaN
1   20
2   20
3   21
4   25
5   29
6   30
7   31
8   31
9   30
10  31

PS 原始问题隐藏了另一个问题,该问题在取出函数的 shift 部分时出现。返回形状不匹配,但那是另一个问题,这里只是为了全面披露而提及它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    相关资源
    最近更新 更多