如何删除一个 pandas 系列中与另一个 pandas 系列相同的值?

Jac*_*rlo 3 python indexing series pandas drop

所以我有一个需要解决的具体问题。我需要删除一个 pandas 系列 (ser1) 中存在的元素,这些元素与另一个 pandas 系列 (ser2) 相同。

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

我尝试了很多其他方法,但都没有真正起作用,并且已经尝试了 3 个小时,现在准备放弃。

这是两个系列:

ser1 = pd.Series([1, 2, 3, 4, 5])
ser2 = pd.Series([4, 5, 6, 7, 8])
Run Code Online (Sandbox Code Playgroud)

结果应该是:

print(ser1)
0   1
1   2
2   3
Run Code Online (Sandbox Code Playgroud)

我确信有一个简单的解决方案。

Cor*_*ien 7

使用.isin

>>> ser1[~ser1.isin(ser2)]
0    1
1    2
2    3
dtype: int64
Run Code Online (Sandbox Code Playgroud)

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

>>> np.setdiff1d(ser1, ser2)
array([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)


Dan*_*ejo 5

一个麻木的替代方案,np.isin

\n
import pandas as pd\nimport numpy as np\n\nser1 = pd.Series([1, 2, 3, 4, 5])\nser2 = pd.Series([4, 5, 6, 7, 8])\n\nres = ser1[~np.isin(ser1, ser2)]\nprint(res)\n
Run Code Online (Sandbox Code Playgroud)\n

微基准测试

\n
import pandas as pd\nimport numpy as np\nser1 = pd.Series([1, 2, 3, 4, 5] * 100)\nser2 = pd.Series([4, 5, 6, 7, 8] * 10)\n%timeit res = ser1[~np.isin(ser1, ser2)]\n136 \xc2\xb5s \xc2\xb1 2.56 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000 loops each)\n%timeit res = ser1[~ser1.isin(ser2)]\n209 \xc2\xb5s \xc2\xb1 1.66 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n%timeit pd.Index(ser1).difference(ser2).to_series()\n277 \xc2\xb5s \xc2\xb1 1.31 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n