“系列的真值是模棱两可的。”系列与元素功能

时间:2015-11-10 03:40:24

标签: python pandas series

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

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是系列而不是单个元素。但是我该如何解决呢?

2 个答案:

答案 0 :(得分:0)

您实际要求的内容有点难以用文字描述,但以下示例捕获了它:

  

如果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))

答案 1 :(得分:0)

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