У меня есть следующий кадр данных, и я хочу заменить nan определенным значением, скажем, 0,0001, только если есть значение, соответствующее отсутствующему значению.
ID 2021_12 2021_09 2021_06 2021_03 2020_12 2020_09
A 0.020637713 nan nan nan nan nan
B 0.020637717 0.020637717 0.020637717 0.020637717 nan 0.007053725
C 0.020637723 0.020637723 0.020637723 0.020637723 0.020637723 0.020637723
D 0.020637729 nan nan nan nan nan
E 0.020637733 0.02504525 0.02504525 nan nan nan
F 0.020637735 0.020637735 0.020637735 nan nan nan
G 0.020637735 nan nan 0.017617495 nan nan
желаемый результат
ID 2021_12 2021_09 2021_06 2021_03 2020_12 2020_09
A 0.020637713 nan nan nan nan nan
B 0.020637717 0.020637717 0.020637717 0.020637717 0.0001 0.007053725
C 0.020637723 0.020637723 0.020637723 0.020637723 0.020637723 0.020637723
D 0.020637729 nan nan nan nan nan
E 0.020637733 0.02504525 0.02504525 nan nan nan
F 0.020637735 0.020637735 0.020637735 nan nan nan
G 0.020637735 0.0001 0.0001 0.017617495 nan nan
Решение проблемы
Используйте DataFrame.mask
с маской для тестовых отсутствующих значений после обратного заполнения пропущенных значений, связанных для тестовых пропущенных значений:
#if misisng values are strings
df = df.replace('nan', np.nan)
df = df.mask(df.bfill(axis=1).notna() & df.isna(), 0.001)
print (df)
ID 2021_12 2021_09 2021_06 2021_03 2020_12 2020_09
0 A 0.020638 NaN NaN NaN NaN NaN
1 B 0.020638 0.020638 0.020638 0.020638 0.001000 0.007054
2 C 0.020638 0.020638 0.020638 0.020638 0.020638 0.020638
3 D 0.020638 NaN NaN NaN NaN NaN
4 E 0.020638 0.025045 0.025045 NaN NaN NaN
5 F 0.020638 0.020638 0.020638 NaN NaN NaN
6 G 0.020638 0.001000 0.001000 0.017617 NaN NaN
Решение для повышения производительности - проверка отсутствия пропущенных значений, замена порядка столбцов с кумулятивной суммой с проверкой, если значения больше, например 0
, последняя замена на исходный порядок в numpy:
#if missing values are strings
df = df.replace('nan', np.nan)
m = df.notna()
m1 = (np.cumsum(m.to_numpy()[:,::-1], axis=1) > 0)[:,::-1]
df = df.mask(m1 & ~m, 0.001)
print (df)
ID 2021_12 2021_09 2021_06 2021_03 2020_12 2020_09
0 A 0.020638 NaN NaN NaN NaN NaN
1 B 0.020638 0.020638 0.020638 0.020638 0.001000 0.007054
2 C 0.020638 0.020638 0.020638 0.020638 0.020638 0.020638
3 D 0.020638 NaN NaN NaN NaN NaN
4 E 0.020638 0.025045 0.025045 NaN NaN NaN
5 F 0.020638 0.020638 0.020638 NaN NaN NaN
6 G 0.020638 0.001000 0.001000 0.017617 NaN NaN
Комментариев нет:
Отправить комментарий