我在pandas中有一个数据框,其中有几列我要转发填充值。目前我正在做:
columns = ['a', 'b', 'c']
for column in columns:
df[column].fillna(method='ffill', inplace=True)
...但是因为列中的系列是不同的长度,所以在它们的一些末端留下填充值的长尾。由于部分系列中的间隙非常大,我无法使用fillna的限制参数,也不会在系列中留下填充值的长尾。
是否可以转发填充每列中的值,除了最后一个值?谢谢!
答案 0 :(得分:3)
你可以在lambda函数中使用last_valid_index
来填充到那一点。
df = pd.DataFrame({
'A': [1, None, None, None],
'B': [1, 2, None, None],
'C': [1, None, 3, None],
'D': [1, None, None, 4]})
>>> df
A B C D
0 1 1 1 1
1 NaN 2 NaN NaN
2 NaN NaN 3 NaN
3 NaN NaN NaN 4
>>> df.apply(lambda series: series.loc[:series.last_valid_index()].ffill())
A B C D
0 1 1 1 1
1 NaN 2 1 1
2 NaN NaN 3 1
3 NaN NaN NaN 4
答案 1 :(得分:0)
除了亚历山大的答案外,如果您想使用NaNs
保存底部行,则可以使用以下内容:
df_ = pd.DataFrame({
'A': [1, None, None, None, None],
'B': [1, 2, None, None, None],
'C': [1, None, 3, None, None],
'D': [1, None, None, 4, None]})
pd.concat([df_.apply(lambda series: series.loc[:series.last_valid_index()].ffill()),
df_.loc[df_.last_valid_index()+1:]])
A B C D
0 1.0 1.0 1.0 1.0
1 NaN 2.0 1.0 1.0
2 NaN NaN 3.0 1.0
3 NaN NaN NaN 4.0
4 NaN NaN NaN NaN