繁体   English   中英

使用基于索引值的系列填充多个缺失值

[英]fill multiple missing values with series based on index values

考虑pd.DataFrame df

df = pd.DataFrame([
        [np.nan, 1,      np.nan],
        [2,      np.nan, np.nan],
        [np.nan, np.nan, 3     ],
    ], list('abc'), list('xyz'))

df

在此输入图像描述

pd.Series s

s = pd.Series([10, 20, 30], list('abc'))

如何填补缺失的值df与的相应值s基于指数s和指数df

例如:

  • df.loc['c', 'x']NaN
  • s.loc['c']30

预期结果
在此输入图像描述

pandas在列的基础上处理这个没有问题。 假设我们有不同的s

s = pd.Series([10, 20, 30], ['x', 'y', 'z'])

然后我们可以

df.fillna(s)

      x     y     z
a  10.0   1.0  30.0
b   2.0  20.0  30.0
c  10.0  20.0   3.0

但那不是你想要的。 用你的s

s = pd.Series([10, 20, 30], ['a', 'b', 'c'])

然后df.fillna(s)什么都不做。 但是我们知道它适用于列,所以:

df.T.fillna(s).T

      x     y     z
a  10.0   1.0  10.0
b   2.0  20.0  20.0
c  30.0  30.0   3.0

这是一种NumPy方法 -

mask = np.isnan(df.values)
df.values[mask] = s[s.index.searchsorted(df.index)].repeat(mask.sum(1))

样品运行 -

In [143]: df
Out[143]: 
     x    y    z
a  NaN  1.0  NaN
b  2.0  NaN  NaN
d  4.0  NaN  7.0
c  NaN  NaN  3.0

In [144]: s
Out[144]: 
a    10
b    20
c    30
d    40
e    50
dtype: int64

In [145]: mask = np.isnan(df.values)
     ...: df.values[mask] = s[s.index.searchsorted(df.index)].repeat(mask.sum(1))
     ...: 

In [146]: df
Out[146]: 
      x     y     z
a  10.0   1.0  10.0
b   2.0  20.0  20.0
d   4.0  40.0   7.0
c  30.0  30.0   3.0

请注意,如果s的索引值未排序,我们需要使用带有searchsorted额外参数sorter

其他方式:

def fillnull(col):
    col[col.isnull()] = s[col.isnull()]
    return col

df.apply(fillnull)

请注意,它的效率低于@Brian的方式(每个循环9ms,而我的计算机每循环1.5ms)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM