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)
我确信有一个简单的解决方案。
使用.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)
一个麻木的替代方案,np.isin
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)\nRun Code Online (Sandbox Code Playgroud)\n微基准测试
\nimport 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)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2537 次 |
| 最近记录: |