7

我有一个DataFrame有四列的 Pandas A, B, C, D,. 事实证明,有时 和 的值B可以C0。因此,我希望获得以下信息:

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表示在框架的所有行上运行。使用 Pandas 很容易找到包含零列的行:

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

但是我不知道如何轻松执行上述转换。我可以想到各种低效和不优雅的方法(for在整个框架上循环),但并不简单。

4

2 回答 2

8

布尔索引和应用的组合可以解决问题。下面是一个关于替换 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
于 2012-08-05T20:07:32.360 回答
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'])
于 2012-08-03T19:05:11.010 回答