【问题标题】:"The truth value of a Series is ambiguous. " Series vs Element Fuction“一个系列的真值是模棱两可的。”系列与元素函数
【发布时间】:2015-11-10 03:40:23
【问题描述】:

我有一个数据框,我编写了以下函数来填充一个新列:

df = pd.DataFrame(np.random.randn(10, 2), columns=['a', 'b'])

def perc(a,b):

    if a/b < 0:
        n = 0
    elif a/b > 1:
        n = 1
    else:
        n = a/b
    return n

df['c']=perc(df['a'],df['b'])

df[1:10]

它应该计算百分比列。这是我得到的错误:

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

我知道这与 dif 和 unc 是系列而不是单个元素有关。但是我该如何解决呢?

【问题讨论】:

  • 你真正想要的行为是什么?给出一个示例输入和预期输出,以演示您尝试捕获的所有逻辑。这是我的猜测,如果dif 是系列[-1, 1, 3, 5]unc 是系列[2, 2, 3, 3] 那么dif/unc 将是[-0.5, 0.5, 1, 1.6666] 并且您想返回[0, 0.5, 1, 1],对吗?
  • 我需要列“C”来显示该行的 a/b 的唯一值。但如果它是负数,它应该是 0%,或者如果它超过 100%,它应该显示 1。
  • 嘿,是的,你明白了。你一定是在我回复后编辑的。请注意,我将我的 OP 编辑​​为更通用的 a/b。

标签: python pandas series


【解决方案1】:

您实际要求的内容有点难以用语言来描述,但下面的示例捕捉到了它:

如果a[-1, 1, 3, 5]系列,b[2, 2, 3, 3],那么a/b就是[-0.5, 0.5, 1, 1.6666667]这样的系列,你最终想要返回的是[0, 0.5, 1, 1]

您可以通过将该系列中的最小值与所有系列中的最小值相加来“将值限制为 1”。类似地,您可以通过取全零系列中的最大值来确保没有任何内容低于 0。 numpy 让您轻松做到这一点:

def perc(a,b):
    length = len(a)
    return np.maximum(np.minimum(np.ones(length), a/b), np.zeros(length))

【讨论】:

  • 这不会帮助在谷歌上找到这个问题的人。该死,应该被骗关闭它。例如stackoverflow.com/q/21415661/1240268
  • @AndyHayden 您将如何将链接中的答案应用于我的问题?这是我的第一个问题,如果您取消投票,我不介意。
【解决方案2】:

这个clip有一个内置方法:

In [134]:
df = pd.DataFrame(np.random.randn(10, 2), columns=['a', 'b'])
df

Out[134]:
          a         b
0  0.676248 -0.320346
1 -1.344982  2.170232
2 -0.150036 -1.606179
3  0.350467  0.386958
4  0.551379 -0.378882
5 -0.283632 -1.559516
6  0.266356 -0.859321
7  0.188118  1.275342
8  0.109570  0.546783
9  0.917231 -0.339878

In [136]:
df['c'] = (df['a']/df['b']).clip(lower=0, upper=1)
df

Out[136]:
          a         b         c
0  0.676248 -0.320346  0.000000
1 -1.344982  2.170232  0.000000
2 -0.150036 -1.606179  0.093412
3  0.350467  0.386958  0.905699
4  0.551379 -0.378882  0.000000
5 -0.283632 -1.559516  0.181872
6  0.266356 -0.859321  0.000000
7  0.188118  1.275342  0.147504
8  0.109570  0.546783  0.200390
9  0.917231 -0.339878  0.000000

【讨论】:

  • 这是一个更好的解决方案。但是有没有办法一次处理 1 个元素?如果我想根据更复杂的公式填充 c 列怎么办?我不能按照我尝试使用 data.frame 的方式来做吗?我习惯于访问一次处理一行的函数。
  • 你可以这样做,但对我来说,这违背了使用提供矢量化方法的 pandas 的全部意义,如果你要这样做,那么使用apply 来处理一个元素
猜你喜欢
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 2019-05-18
  • 1970-01-01
相关资源
最近更新 更多