向前填充除python pandas dataframe

时间:2016-04-03 17:05:13

标签: python pandas

我在pandas中有一个数据框,其中有几列我要转发填充值。目前我正在做:

columns = ['a', 'b', 'c']
for column in columns:
    df[column].fillna(method='ffill', inplace=True)

...但是因为列中的系列是不同的长度,所以在它们的一些末端留下填充值的长尾。由于部分系列中的间隙非常大,我无法使用fillna的限制参数,也不会在系列中留下填充值的长尾。

是否可以转发填充每列中的值,除了最后一个值?谢谢!

2 个答案:

答案 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