【问题标题】:Forward fill all except last value in python pandas dataframe前向填充除python pandas数据框中的最后一个值之外的所有值
【发布时间】:2016-04-03 17:05:13
【问题描述】:

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

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

...但是由于列中的系列长度不同,因此在其中一些的末端留下了填充值的长尾。因为某些系列的差距很大,所以我不能使用fillna的limit参数而不在系列上留下填充值的长尾。

除了最后一个值之外,是否可以前向填充每列中的值?谢谢!

【问题讨论】:

  • 我认为可以使用包含直到最后一个 NaN 的所有值的掩码来填充,但是请您提供一个示例数据集来使用吗?

标签: python pandas


【解决方案1】:

您可以在 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

【讨论】:

    【解决方案2】:

    除了 Alexander 的回答之外,如果您想使用NaNs 保留底部行,您可以使用以下内容:

    df2 = 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]})
    
    df2
        A   B   C   D
    0   1   1   1   1
    1 NaN   2 NaN NaN
    2 NaN NaN   3 NaN
    3 NaN NaN NaN   4
    4 NaN NaN NaN NaN
    
    pd.concat([df2.apply(lambda series: series.loc[:series.last_valid_index()].ffill()),
               df2.loc[df2.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
    

    【讨论】:

      猜你喜欢
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 2017-12-28
      • 2014-11-09
      • 2021-03-21
      相关资源
      最近更新 更多