我有一个数据框,我编写了以下函数来填充新列:
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是系列而不是单个元素。但是我该如何解决呢?
答案 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