给出两个布尔Pandas 序列,比如st,我们如何用t中的值替换s的子集?

示例:

>>> s = pd.Series([True, False, False, True, True, False])
>>> t = pd.Series([True, True, False])
>>> s
0     True
1    False
2    False
3     True
4     True
5    False
dtype: bool
>>> t
0     True
1     True
2    False
dtype: bool

s值中的False替换为t时的预期输出:

>>> s
0     True
1     True
2     True
3     True
4     True
5    False
dtype: bool

也就是说,s中值为False的索引,即[1, 2, 5]值被替换为[True, True, False],即t.

我try 使用布尔掩码替换以下值,但没有成功.

>>> s[~s] = t
>>> s
0     True
1     True
2    False
3     True
4     True
5      NaN
dtype: object

使用s.mask(~s, t)将返回类似的结果.为什么我在索引5得到一个NaN,谁不起作用?

虽然使用iloc Select 子集,然后替换Works,但这似乎是一种迂回的方法来实现这一点,我希望有一种更干净的方法来实现这一点.有吗?

>>> s.iloc[s[~s].index] = t
>>> s
0     True
1     True
2     True
3     True
4     True
5    False
dtype: bool

推荐答案

你的问题是因为Pandas 使用索引来重新排列系列.

您需要使用一个数组:

s[~s] = t.values

# or
s[~s] = t.to_numpy()

请注意,t需要与s中的False具有相同的形状.

如果不是这样,请使用:

s[s[~s].index[:len(t)]] = t.to_numpy()[:sum(~s)]

# Or

m = ~s
s[m] = pd.Series(dict(zip(s.index[m], t)))

输出:

0     True
1     True
2     True
3     True
4     True
5    False
dtype: bool

Python相关问答推荐

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

在Python中对分层父/子列表进行排序

在内部列表上滚动窗口

C#使用程序从Python中执行Exec文件

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

计算每个IP的平均值

如何在UserSerializer中添加显式字段?

从嵌套的yaml创建一个嵌套字符串,后面跟着点

如何保持服务器发送的事件连接活动?

CommandeError:模块numba没有属性generated_jit''''

在单次扫描中创建列表

如何在PySide/Qt QColumbnView中删除列

从列表中获取n个元素,其中list [i][0]== value''

导入错误:无法导入名称';操作';

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

为什么我的sundaram筛这么低效

pandas fill和bfill基于另一列中的条件

计算机找不到已安装的库'

如何从一个维基页面中抓取和存储多个表格?