熊猫DataFrame应用

问题描述:

我有一个熊猫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循环),但并不简单。

布尔索引和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

尝试使用'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'])