我想水平向前填充值,但仅限于一个填充值。
请参阅以下框架:dfa
有一些空白需要填补。我想要的结果如dfb
所示。
(请注意行尾的.T
,将数据水平转置。)
但是,dfa.fillna(0, limit=1, axis=1)
填充了Name
行中的所有单元格,而第5列和第6列(即7
行中Name
左侧的两列)应该保持NaN。
import pandas as pd
import numpy as np
dfa = pd.DataFrame({'Name':[1, np.nan, 3, np.nan, np.nan, np.nan, 7, np.nan],
'Age': [np.nan, 2, np.nan, 4, np.nan, 6, np.nan, 8]}).T
dfb = pd.DataFrame({'Name':[1, 0, 3, 0, np.nan, np.nan, 7, 0],
'Age': [np.nan, 2, 0, 4, 0, 6, 0, 8]}).T
dfc = dfa.fillna(0, limit=1, axis=1)
答案 0 :(得分:2)
一个想法是使用正向填充蒙版,然后用&
替换为DataFrame.mask
链接条件:
m = dfa.ffill(limit=1, axis=1).isna()
print (m)
0 1 2 3 4 5 6 7
Name False False False False True True False False
Age True False False False False False False False
dfc = dfa.mask(dfa.isna() & ~m, 0)
或者首先替换所有NaN
,然后根据条件创建NaN
:
dfc = dfa.fillna(0).mask(m)
print (dfc)
0 1 2 3 4 5 6 7
Name 1.0 0.0 3.0 0.0 NaN NaN 7.0 0.0
Age NaN 2.0 0.0 4.0 0.0 6.0 0.0 8.0