【问题标题】:Row-by-row fillna with respect to a specific column?关于特定列的逐行填充?
【发布时间】:2014-06-03 12:37:53
【问题描述】:

我有以下 pandas 数据框,我想用 D 列中的值以逐行方式填充 A-C 列中的 NaN。是否有明确的方法来执行此操作,我可以定义所有 NaN 应该依赖D列中的值按行排列?我找不到在 fillna() 中明确执行此操作的方法。

请注意,还有其他列 E-Z,它们有自己的 NaN,并且可能有其他填充 NaN 的规则,应该保持不变

A        B        C        D       E
158      158      158      177     ...  
158      158      158      177     ...
NaN      NaN      NaN      177     ...   
158      158      158      177     ...
NaN      NaN      NaN      177     ...  

希望仅对 A-C 列使用此功能:

A        B        C        D       E
158      158      158      177     ...  
158      158      158      177     ...
177      177      177      177     ...   
158      158      158      177     ...
177      177      177      177     ...  

谢谢。

【问题讨论】:

    标签: python pandas missing-data


    【解决方案1】:

    使用fillna函数:

    df.fillna(axis=1, method='backfill')
    

    如果其他列中没有 NaN 则可以。
    如果有并且您想让它们保持不变,我认为这种方式的唯一选择是在数据框的子集上执行fillna。使用示例数据框:

    In [45]: df
    Out[45]: 
         A    B    C    D   E   F
    0  158  158  158  177   1  10
    1  158  158  158  177   2  20
    2  NaN  NaN  NaN  177   3  30
    3  158  158  158  177 NaN  40
    4  NaN  NaN  NaN  177   5  50
    
    In [48]: df[['A', 'B', 'C', 'D']] = df[['A', 'B', 'C', 'D']].fillna(axis=1, method='backfill')
    
    In [49]: df
    Out[49]: 
         A    B    C    D   E   F
    0  158  158  158  177   1  10
    1  158  158  158  177   2  20
    2  177  177  177  177   3  30
    3  158  158  158  177 NaN  40
    4  177  177  177  177   5  50
    

    Udate:如果您不想依赖列顺序,您还可以指定用于填充每一行的值(如.fillna(value=df['D'])。唯一的问题是这只适用于系列(当它是一个数据框时,它会尝试将不同的值映射到不同的列,而不是行)。因此,通过逐列申请,它可以工作:

    In [60]: df[['A', 'B', 'C']].apply(lambda x: x.fillna(value=df['D']))
    Out[60]: 
         A    B    C
    0  158  158  158
    1  158  158  158
    2  177  177  177
    3  158  158  158
    4  177  177  177
    

    【讨论】:

    • 谢谢,这是有道理的。但是有没有办法通过明确定义其他 NaN 列应该从中获取值的列来做到这一点?例如。如果列'E'和'F'也有NaN,我还希望它们用来自列'D'的值逐行填充?从某种意义上说,这将使填充逻辑独立于列排序。
    • D 列并不像您的示例中那样始终保持不变?因为在那种情况下,你当然可以做的更简单。
    • 没错,它不是一成不变的——我应该选择一个更好/不那么琐碎的例子。感谢您的帮助!
    【解决方案2】:

    你也可以使用下面的代码

    cols = ['A', 'B', 'C', 'D']
    df.loc[:,cols] = df.loc[:,cols].bfill()
    

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多