【问题标题】:Python pandas dataframe fill NaN with other SeriesPython pandas 数据框用其他系列填充 NaN
【发布时间】:2017-03-11 18:47:26
【问题描述】:

我想根据控制表 (fillna_mean) 使用列均值填充数据帧 (df) 列 (var4) 中的 NaN 值,并将 var1 作为索引。在数据帧中,我希望它们与 var1 匹配。

我曾尝试使用 fillna 来执行此操作,但我并没有让它一直工作。如何使用 df.var1 作为匹配 fillna_mean.var1 的索引以智能方式执行此操作?

df:

df = pd.DataFrame({'var1' : list('a' * 3) + list('b' * 2) + list('c' * 4) + list('d' * 3)
         ,'var2' : [i for i in range(12)]
         ,'var3' : list(np.random.randint(100, size = 12))
         ,'var4' : [1, 2, np.nan, 3, 2, np.nan, 1, 34, np.nan, np.nan, 12, 12]
     })

fillna_mean:

fillna = pd.DataFrame({'var1' : ['a', 'b', 'c', 'd'],
                       'mean' : [1, 3.5, 6.5, 10]})

最终结果是这样的:

变量 1 变量 2 变量 3 变量 4 0 69 1.0 1 17 2.0 2 83 1.0 b 3 12 3.0 b 4 36 2.0 c 5 68 6.5 c 6 13 1.0 c 7 30 34.0 c 8 23 6.5 d 9 82 10.0 d 10 32 12.0 d 11 19 12.0

提前感谢您的意见!

/swepab

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以将boolean indexing.map() 方法结合使用:

    In [178]: fillna.set_index('var1', inplace=True)
    
    In [179]: df.loc[df.var4.isnull(), 'var4'] = df.loc[df.var4.isnull(), 'var1'].map(fillna['mean'])
    
    In [180]: df
    Out[180]:
       var1  var2  var3  var4
    0     a     0    40   1.0
    1     a     1    97   2.0
    2     a     2    34   1.0
    3     b     3     6   3.0
    4     b     4    19   2.0
    5     c     5    47   6.5
    6     c     6    65   1.0
    7     c     7    29  34.0
    8     c     8    48   6.5
    9     d     9    88  10.0
    10    d    10    40  12.0
    11    d    11    23  12.0
    

    解释:

    In [184]: df.loc[df.var4.isnull()]
    Out[184]:
      var1  var2  var3  var4
    2    a     2    75   NaN
    5    c     5    75   NaN
    8    c     8    44   NaN
    9    d     9    34   NaN
    
    In [185]: df.loc[df.var4.isnull(), 'var1']
    Out[185]:
    2    a
    5    c
    8    c
    9    d
    Name: var1, dtype: object
    
    In [186]: df.loc[df.var4.isnull(), 'var1'].map(fillna['mean'])
    Out[186]:
    2     1.0
    5     6.5
    8     6.5
    9    10.0
    Name: var1, dtype: float64
    

    更新: 从 Pandas 0.20.1 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers 开始。

    【讨论】:

    • 纯粹的美在那个 - 坚实的胜利!谢谢一百万!
    【解决方案2】:

    获得更快的结果with combine_first,并且您不必费心过滤掉非空数据:

    fillna.set_index('var1', inplace=True)
    
    df.var4 = df.var4.combine_first(df.var1.map(fillna['mean']))
    

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 2020-05-14
      • 2017-12-26
      • 1970-01-01
      • 2022-10-07
      • 2021-12-20
      • 2023-02-09
      • 2019-11-21
      • 1970-01-01
      相关资源
      最近更新 更多