所以我有一个具体的问题需要解决。我需要删除一个熊猫系列(ser1)中与另一个熊猫系列(ser2)相同的元素。
我尝试了许多不起作用的东西,最近找到的是使用np.intersect1d()函数的数组。这可以找到公共值,但是当我尝试删除与这些值相等的索引时,我会遇到很多错误。
我已经尝试了很多其他的事情,但这些东西并没有真正发挥作用,而且已经持续了3个小时,所以我要放弃了。
以下是两个系列:
ser1 = pd.Series([1, 2, 3, 4, 5])
ser2 = pd.Series([4, 5, 6, 7, 8])
其结果应该是:
print(ser1)
0 1
1 2
2 3
我相信有一个简单的解决办法。
发布于 2021-10-29 12:06:39
一个不起眼的选择,np.isin
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
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)
发布于 2021-10-29 11:59:19
使用.isin
>>> ser1[~ser1.isin(ser2)]
0 1
1 2
2 3
dtype: int64
numpy版本是.setdiff1d
(而不是.intersect1d
)
>>> np.setdiff1d(ser1, ser2)
array([1, 2, 3])
发布于 2021-10-29 12:02:44
您可以使用set表示法--与isin相比,我不确定速度:
pd.Index(ser1).difference(ser2).to_series()
Out[35]:
1 1
2 2
3 3
dtype: int64
https://stackoverflow.com/questions/69774160
复制