2015-11-10 18 views
-2

我有一個數據幀,我寫了下面的函數來填充新列:「系列的真值是不明確的。」系列VS元函數的恆等式

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

什麼行爲,你居然想要什麼?給出一個示例輸入和期望的輸出,演示您試圖捕獲的所有邏輯。這是我的猜測,如果'dif'是系列'[-1,1,3,5]','unc'是系列'[2,3,3]',那麼'dif/unc'將是' [-0.5,0.5,1,1.6666]',你會想返回'[0,0.5,1,1]',這是否正確? –

+0

我需要列'C'來顯示該行的a/b的唯一值。但如果它的負面應該是0%,或者如果其超過100%,它應該顯示1. – Mateyobi

+0

嘿,你知道了。我回應後一定是編輯過它的。請注意,我編輯我的OP是更通用的a/b。 – Mateyobi

回答

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)) 
+0

這將幫助沒有人在谷歌上發現這個問題。當,應該是關閉它。例如http://stackoverflow.com/q/21415661/1240268 –

+0

這個工程!但爲什麼我的功能沒有工作? – Mateyobi

+0

@AndyHayden你如何將你的鏈接中的答案應用於我的問題?這是我的第一個問題,如果你解開了你的棄權票,我不介意。 – Mateyobi

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 
+0

這是一個更好的解決方案。但是有沒有辦法一次處理1個元素?如果我想根據更復雜的公式填充列c,該怎麼辦?我可以不按照我使用data.frame的方式來完成嗎?我習慣於訪問一次處理一行的函數。 – Mateyobi

+0

你可以做到這一點,但對我來說,這打破了使用提供矢量化方法的熊貓的全部要點,如果你打算這樣做,那麼使用'apply'來處理一個元素 – EdChum

相關問題