考虑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
答案 0 :(得分:4)
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
答案 1 :(得分:2)
这是一种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
的索引值未排序,我们需要在sorter
处使用额外参数searchsorted
。
答案 2 :(得分:2)
另一种方式:
def fillnull(col):
col[col.isnull()] = s[col.isnull()]
return col
df.apply(fillnull)
请注意,它的效率低于@Brian的方式(每个循环9ms,而我的计算机每循环1.5ms)