2015-09-03 147 views
2

不是一個很好的問題,但這裏是:
我正在做一個非常簡單的計算,結合DataFrame的幾列,但只有當一列有一定的值時。我們的想法是:簡化熊貓表達式

if df.x==1: 
    df.y = df.y - df.a/df.b 

現在當然環路是緩慢的,所以我這樣做是對數據幀的子集,但這會非常詳細的速度非常快:

df.loc[df.x==1, 'y'] = df.loc[df.x==1, 'y'] - df.loc[df.x==1, 'a']/df.loc[df.x==1, 'b'] 

我有一種感覺,有這樣一個更好的方式,任何想法?

+2

不會'df.loc [df.x == 1,'y'] = df ['y'] - df ['a']/df ['b']'只是工作嗎? – EdChum

+0

我認爲你是對的 - 我以某種方式認爲我必須確保右側的所有物體與左側的物體具有相同的長度,但對於所有物體RHS,只寫LHS上的一個子集...... –

+0

rhs將與lhs上的索引對齊,因爲我們在這裏使用'loc'它確保正確的行將被分配 – EdChum

回答

2

正如@EdChum暗示他的評論,你可以直接使用.loc。您可以通過使用-=表示法進一步簡化。

df = pd.DataFrame({'x': [1, 2, 3], 
        'y': [1, 2, 3], 
        'a': [1, 2, 3], 
        'b': [2, 2, 2]}) 

>>> df 
    a b x y 
0 1 2 1 1 
1 2 2 2 2 
2 3 2 3 3 

df.loc[df.x==1, 'y'] -= df.a/df.b 

>>> df 
    a b x y 
0 1 2 1 0.5 
1 2 2 2 2.0 
2 3 2 3 3.0