我有一个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。
如何有条件地将一列中的单元格值替换为同一行中另一列中的值?
答案 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