【问题标题】:forward fill specific columns in pandas dataframe前向填充熊猫数据框中的特定列
【发布时间】:2021-11-12 09:01:02
【问题描述】:

如果我有一个包含多列 ['x', 'y', 'z'] 的数据框,我如何只转发填充一列 'x'?还是一组列['x','y']

我只知道按轴做。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    tl;博士:

    cols = ['X', 'Y']
    df.loc[:,cols] = df.loc[:,cols].ffill()
    

    我还添加了一个自包含示例:

    >>> import pandas as pd
    >>> import numpy as np
    >>> 
    >>> ## create dataframe
    ... ts1 = [0, 1, np.nan, np.nan, np.nan, np.nan]
    >>> ts2 = [0, 2, np.nan, 3, np.nan, np.nan]
    >>> d =  {'X': ts1, 'Y': ts2, 'Z': ts2}
    >>> df = pd.DataFrame(data=d)
    >>> print(df.head())
        X   Y   Z
    0   0   0   0
    1   1   2   2
    2 NaN NaN NaN
    3 NaN   3   3
    4 NaN NaN NaN
    >>> 
    >>> ## apply forward fill
    ... cols = ['X', 'Y']
    >>> df.loc[:,cols] = df.loc[:,cols].ffill()
    >>> print(df.head())
       X  Y   Z
    0  0  0   0
    1  1  2   2
    2  1  2 NaN
    3  1  3   3
    4  1  3 NaN
    

    【讨论】:

    • 这会抛出一个SettingWithCopyWarning。担心这个警告有什么想法吗?
    • 请参阅此处关于 Python 中首选索引方式的描述:pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html 更改为 .loc 语句应该可以解决问题,我已经相应地更新了答案。
    • 如果我希望在填充时排除 X 和 Y 列?
    • ## apply forward fill with exclusion cols_ex = ['X', 'Y'] # define columns to exclude \\ cols = df.columns # get list with all columns \\ cols_to_ff = cols.drop(cols_ex) # drop columns to exclude \\ df.loc[:,cols_to_ff] = df.loc[:,cols_to_ff].ffill() # forward fill the selected columns \\
    【解决方案2】:
    for col in ['X', 'Y']:
        df[col] = df[col].ffill()
    

    【讨论】:

      【解决方案3】:

      两列可以同时为ffill(),如下所示:

      df1 = df[['X','Y']].ffill()
      

      【讨论】:

      • 我首先尝试了这个解决方案,因为它对我来说似乎更干净,但这个解决方案的一个问题是只有 X 和 Y 列保存在 df1 数据框中。其余列不是。 Woody Pride 和 Abhishek Chaurasia 的回复都保留了所有列。
      【解决方案4】:

      或者使用inplace 参数:

      df['X'].ffill(inplace=True)
      df['Y'].ffill(inplace=True)
      

      不,你不能这样做df[['X','Y]].ffill(inplace=True),因为这首先会通过列选择创建一个切片,因此就地前向填充会创建一个 SettingWithCopyWarning。当然,如果您有一个列列表,您可以循环执行此操作:

      for col in ['X', 'Y']:
          df[col].ffill(inplace=True)
      

      使用inplace的目的是避免复制列。

      【讨论】:

        【解决方案5】:

        我使用下面的代码,这里的 X 和 Y 方法也可以不同,而不是 ffill()

         df1 = df.fillna({
                'X' : df['X'].ffill(),
                'Y' : df['Y'].ffill(),
            })
        

        【讨论】:

          【解决方案6】:

          我认为最简单的版本。

          cols = ['X', 'Y']
          df[cols] = df[cols].ffill()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-06-20
            • 2019-06-05
            • 1970-01-01
            • 2019-03-14
            • 2020-11-08
            • 2020-03-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多