2012-08-03 251 views
7

我有一個熊貓DataFrame四列,A, B, C, D。事實證明,有時,BC的值可以是0。因此,我希望得到以下幾點:熊貓DataFrame應用

B[i] = B[i] if B[i] else min(A[i], D[i]) 
C[i] = C[i] if C[i] else max(A[i], D[i]) 

,我已經使用i指示在幀的所有行運行。隨着熊貓很容易找到包含零列的行:

df[df.B == 0] and df[df.C == 0] 

但是我不知道如何輕鬆地執行上述轉換。我可以想到各種效率低下且不夠優雅的方法(整個幀中的for循環),但並不簡單。

回答

8

布爾索引和apply的組合可以做到這一點。 下面的一個例子就是C列中零元素的替換。

In [22]: df 
Out[22]: 
    A B C D 
0 8 3 5 8 
1 9 4 0 4 
2 5 4 3 8 
3 4 8 5 1 

In [23]: bi = df.C==0 

In [24]: df.ix[bi, 'C'] = df[bi][['A', 'D']].apply(max, axis=1) 

In [25]: df 
Out[25]: 
    A B C D 
0 8 3 5 8 
1 9 4 9 4 
2 5 4 3 8 
3 4 8 5 1 
+1

很整齊。不過,我認爲你可以用'.max(axis = 1)'而不是'apply(...)'來避開。 – 2012-08-05 23:22:32

+0

'max()'當然也沒問題,我想我對你提出問題的方式偏向於'apply'.-) – 2012-08-06 11:05:57

2

嘗試使用'iterrows'DataFrame類方法,以便高效地遍歷DataFrame的行。請參閱pandas 0.8.1指南的第6.7.2章。

from pandas import * 
import numpy as np 

df = DataFrame({'A' : [5,6,3], 'B' : [0,0,0], 'C':[0,0,0], 'D' : [3,4,5]}) 

for idx, row in df.iterrows(): 
    if row['B'] == 0: 
     row['B'] = min(row['A'], row['D']) 
    if row['C'] == 0: 
     row['C'] = min(row['A'], row['D'])