从另一个Series更新(覆盖)pandas Series中的值?

5
我有两个pandas系列: serovrser包含对象,ovr是一个稀疏的对象和NoneSeriesserovr共享相同的索引,我想用其相应的ovr值覆盖每个ser值,除非该相应的值为None
有什么有效的方法可以实现这一点?
1个回答

7
我建议在处理缺失数据时使用NaN而不是None(注意:这种技术也适用于None)。请参考此处
In [1]: s1 = pd.Series([1, np.nan, 3, 4, 5, np.nan])

In [2]: s2 = pd.Series([7, 2, 3, np.nan, np.nan])

首先,查看s2中非NaN(或None)的值,这些是您想要用来更新s1的值:
In [3]: s2[s2.notnull()]
Out[3]:
0    7
1    2
2    3
dtype: float64

然后您可以使用这些内容更新s1的值:

In [4]: s1.update(s2[s2.notnull()])

In [5]: s1
Out[5]:
0     7
1     2
2     3
3     4
4     5
5   NaN
dtype: float64

谢谢!这个很有效。顺便问一下,即使涉及到dtypeobjectSeries,你为什么推荐使用NaN而不是None来表示缺失值呢? - Dun Peal
2
@DunPeal https://dev59.com/ZmMm5IYBdhLWcg3wivf7#17534682 - Andy Hayden
@AndyHayden,我真的需要这个问题的答案,但是在谷歌上找了很久都没有找到。我们能否编辑问题,摆脱那些不太相关的稀疏内容,并将标题中的“override”更改为“replace”或“update”? - LondonRob
标题现在好多了! - LondonRob
其实这比这还要简单。你不需要在s2中去掉空值。只需使用s1.update(s2)即可。请参阅文档:'如果其他包含NaN,则相应的值不会在原始Series中更新。'(也许这个API在过去的7年中已经改变了!) - daviewales

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接