熊猫DataFrame应用
问题描述:
我有一个熊猫DataFrame
四列,A, B, C, D
。事实证明,有时,B
和C
的值可以是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
答
尝试使用'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'])
很整齐。不过,我认为你可以用'.max(axis = 1)'而不是'apply(...)'来避开。 – 2012-08-05 23:22:32
'max()'当然也没问题,我想我对你提出问题的方式偏向于'apply'.-) – 2012-08-06 11:05:57