用另一行的单元格值条件替换pandas单元格值

时间:2016-04-22 19:59:30

标签: python pandas

我有一个pandas数据帧pmov,列SDRFT和DRFT包含浮点值。一些DRFT值为0.0。当发生这种情况时,我想用SDRFT值替换DRFT值。出于测试目的,我在数据帧df中存储了DRFT = 0.0的行。

我已尝试定义该功能:

def SDRFT_is_DRFT(row):
    if row['SDRFT'] == row['DRFT']:
        pass
    elif row['SDRFT'] == 0:
        row['SDRFT'] = row['DRFT']
    elif ['DRFT'] == 0:
        row['DRFT'] = row['SDRFT']
    return row[['SDRFT','DRFT']]

并将其应用于:df.apply(SDRFT_is_DRFT, axis=1)

返回:

In []: df.apply(SDRFT_is_DRFT, axis=1)
Out[]: 
           SDRFT  DRFT
118    29.500000   0.0
144     0.000000   0.0
212    29.166667   0.0
250    21.000000   0.0
308    21.500000   0.0
317    24.500000   0.0
327    11.000000   0.0
334    31.000000   0.0
347    29.500000   0.0
348    35.000000   0.0

这不是我想要的结果。

我也试过这个功能:

def drft_repl(row):
    if row['DRFT']==0:
        row['DRFT'] = row['SDRFT']

似乎适用于df.DRFT = df.apply(drft_repl,axis = 1)

但是pmov.DRFT = pmov.apply(drft_repl, axis=1)导致使用SDRFT值100%替换DRFT值,除非DRFT值为nan。

如何有条件地将一列中的单元格值替换为同一行中另一列中的值?

2 个答案:

答案 0 :(得分:0)

试试这个:

df.loc[df.DRFT == 0, 'DRFT'] = df.SDRFT 

答案 1 :(得分:0)

我认为你可以使用mask。首先替换列SDRFT,其值为DRFT,其中条件为True,最后一列替换为DRFT列,值为SDRFT

pmov.SDRFT = pmov.SDRFT.mask(pmov.SDRFT == 0, pmov.DRFT)
pmov.DRFT = pmov.DRFT.mask(pmov.DRFT == 0, pmov.SDRFT)
print pmov  
         SDRFT       DRFT
118  29.500000  29.500000
144   0.000000   0.000000
212  29.166667  29.166667
250  21.000000  21.000000
308  21.500000  21.500000
317  24.500000  24.500000
327  11.000000  11.000000
334  31.000000  31.000000
347  29.500000  29.500000
348  35.000000  35.000000

loc的另一个解决方案:

pmov.loc[pmov.SDRFT == 0, 'SDRFT'] = pmov.DRFT 
pmov.loc[pmov.DRFT == 0, 'DRFT'] = pmov.SDRFT 
print pmov  
         SDRFT       DRFT
118  29.500000  29.500000
144   0.000000   0.000000
212  29.166667  29.166667
250  21.000000  21.000000
308  21.500000  21.500000
317  24.500000  24.500000
327  11.000000  11.000000
334  31.000000  31.000000
347  29.500000  29.500000
348  35.000000  35.000000

为了更好的测试DataFrame已更改:

print pmov
     SDRFT   DRFT
118   29.5  29.50
144    0.0   5.98
212    0.0   7.30
250   21.0   0.00
308   21.5   0.00
317    0.0   0.00
327   11.0   0.00
334   31.0   0.00
347   29.5   0.00
348   35.0  35.00

pmov.SDRFT = pmov.SDRFT.mask(pmov.SDRFT == 0, pmov.DRFT)
pmov.DRFT = pmov.DRFT.mask(pmov.DRFT == 0, pmov.SDRFT)
print pmov 
     SDRFT   DRFT
118  29.50  29.50
144   5.98   5.98
212   7.30   7.30
250  21.00  21.00
308  21.50  21.50
317   0.00   0.00
327  11.00  11.00
334  31.00  31.00
347  29.50  29.50
348  35.00  35.00
pmov.loc[pmov.DRFT == 0, 'DRFT'] = pmov.SDRFT 
pmov.loc[pmov.SDRFT == 0, 'SDRFT'] = pmov.DRFT 
print pmov  
     SDRFT   DRFT
118  29.50  29.50
144   5.98   5.98
212   7.30   7.30
250  21.00  21.00
308  21.50  21.50
317   0.00   0.00
327  11.00  11.00
334  31.00  31.00
347  29.50  29.50
348  35.00  35.00