Python 熊猫:使用布尔掩蔽和索引指定值
考虑以下玩具示例:Python 熊猫:使用布尔掩蔽和索引指定值,python,pandas,Python,Pandas,考虑以下玩具示例: df = pd.DataFrame([0,1,2,3,4,5,6], columns=['Value']) df_subset = df.loc[[3,4,5]] df.loc[df.Value % 2 == 0, 'Value'] = df_subset.Value * 10 分配前df: 0 一, 二, 三, 四, 五, 六, df分配后: 楠 一, 楠 三, 四十 五, 楠 发生这种情况的原因如下: 仅修改掩码/布尔索引为真的项,即仅修改偶数元素 这就是为什么i
df = pd.DataFrame([0,1,2,3,4,5,6], columns=['Value'])
df_subset = df.loc[[3,4,5]]
df.loc[df.Value % 2 == 0, 'Value'] = df_subset.Value * 10
分配前df:
发生这种情况的原因如下:
- 仅修改掩码/布尔索引为真的项,即仅修改偶数元素
- 这就是为什么
未设置为NaN的原因idx=1
- 任何未出现在右侧索引中的索引都设置为NaN
- 修改遮罩为真的元素
- 对于这些元素:如果特定索引是
df.index
第一个想法是通过
&
为按位和
链接两个掩码,因为使用了测试索引:
或:
另一个想法是通过原始掩码过滤子集并使用:
验证的预期输出如何?@jezrael I添加了所需的结果。我认为,如果索引或子组包含数百万个条目,则由于
isin()
操作,这将不可行。想详细介绍一下这个话题吗?太好了,我相信update()
正是我想要的。谢谢,我做了一些快速基准测试,结果表明,尽管我最初的直觉是,isin()
variant(16.4毫秒)的速度几乎是update()
variant(29.6毫秒)的两倍,用于包含10^6个条目和一组3*10^4个条目的数据帧(我确保对子组使用Int64Index
而不是RangeIndex
)注意:这不适用于更大的数据帧(10^7和子组3*10^5)。在这种情况下update()
提供了2-3的加速。虽然子组大小似乎几乎不相关,但10^4和3*10^5之间似乎没有任何差异。
df = pd.DataFrame([0,1,2,3,4,5,6], columns=['Value'])
df_subset = df.loc[[3,4,5]]
mask = (df.Value % 2 == 0) & (df.index.isin([3,4,5]))
df.loc[mask, 'Value'] = df_subset.Value * 10
print (df)
Value
0 0
1 1
2 2
3 3
4 40
5 5
6 6
df = pd.DataFrame([0,1,2,3,4,5,6], columns=['Value'])
mask = (df.Value % 2 == 0) & (df.index.isin([3,4,5]))
df.loc[mask, 'Value'] *= 10
print (df)
Value
0 0
1 1
2 2
3 3
4 40
5 5
6 6
df = pd.DataFrame([0,1,2,3,4,5,6], columns=['Value'])
df_subset = df.loc[[3,4,5]]
df.update(df_subset.loc[df.Value % 2 == 0, 'Value'] * 10)
#alternative
#df.update(df_subset.loc[df_subset.Value % 2 == 0, 'Value'] * 10)
print (df)
Value
0 0.0
1 1.0
2 2.0
3 3.0
4 40.0
5 5.0
6 6.0