首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从一个熊猫系列中删除另一个熊猫系列中常见的值?

如何从一个熊猫系列中删除另一个熊猫系列中常见的值?
EN

Stack Overflow用户
提问于 2021-10-29 19:57:01
回答 3查看 1.5K关注 0票数 3

所以我有一个具体的问题需要解决。我需要删除一个熊猫系列(ser1)中与另一个熊猫系列(ser2)相同的元素。

我尝试了许多不起作用的东西,最近找到的是使用np.intersect1d()函数的数组。这可以找到公共值,但是当我尝试删除与这些值相等的索引时,我会遇到很多错误。

我已经尝试了很多其他的事情,但这些东西并没有真正发挥作用,而且已经持续了3个小时,所以我要放弃了。

以下是两个系列:

代码语言:javascript
代码运行次数:0
运行
复制
ser1 = pd.Series([1, 2, 3, 4, 5])
ser2 = pd.Series([4, 5, 6, 7, 8])

其结果应该是:

代码语言:javascript
代码运行次数:0
运行
复制
print(ser1)
0   1
1   2
2   3

我相信有一个简单的解决办法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-29 20:06:39

一个不起眼的选择,np.isin

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd
import numpy as np

ser1 = pd.Series([1, 2, 3, 4, 5])
ser2 = pd.Series([4, 5, 6, 7, 8])

res = ser1[~np.isin(ser1, ser2)]
print(res)

Micro-Benchmark

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd
import numpy as np
ser1 = pd.Series([1, 2, 3, 4, 5] * 100)
ser2 = pd.Series([4, 5, 6, 7, 8] * 10)
%timeit res = ser1[~np.isin(ser1, ser2)]
136 µs ± 2.56 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit res = ser1[~ser1.isin(ser2)]
209 µs ± 1.66 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit pd.Index(ser1).difference(ser2).to_series()
277 µs ± 1.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
票数 4
EN

Stack Overflow用户

发布于 2021-10-29 19:59:19

使用.isin

代码语言:javascript
代码运行次数:0
运行
复制
>>> ser1[~ser1.isin(ser2)]
0    1
1    2
2    3
dtype: int64

numpy版本是.setdiff1d (而不是.intersect1d)

代码语言:javascript
代码运行次数:0
运行
复制
>>> np.setdiff1d(ser1, ser2)
array([1, 2, 3])
票数 6
EN

Stack Overflow用户

发布于 2021-10-29 20:02:44

您可以使用set表示法--与isin相比,我不确定速度:

代码语言:javascript
代码运行次数:0
运行
复制
pd.Index(ser1).difference(ser2).to_series()
Out[35]: 
1    1
2    2
3    3
dtype: int64
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69774160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档