我有两个
pd.Series
喜欢
A = [1, 3, 5, 7]
B = [3, 4, 5, 8, 10]
我想联合他们以获得一个新的列表
C = [1, 3, 4, 5, 7, 8, 10]
下面的代码可以解决。
A = pd.Series([1, 3, 5, 7], name='col')
B = pd.Series([3, 4, 5, 8, 10], name='col')
pd.concat([A,B], axis=0).drop_duplicates().sort_values(ascending=True)
或者我也可以做
list(set(A).union(set(B))).sort()
我真正的问题有非常巨大的数组,A1、A2、A3、A50 中的每一个都有 100k+ 字符串。并且超过 99% 的元素是重叠的。 并集运算将运行 50 次。
哪种解决方案更省时?我们是否有更有效的方法来使用
Cython
或 numba
来联合它们?
如果您首先转换为列表,集合操作可能会非常高效、更快:
sorted(set(A.tolist()).union(B.tolist()))
numpy.union1d
:
# 100k+ strings. And more than 99% elements are overlapping
A = pd.Series(map(str, range(100_000))).sample(frac=1)
B = pd.Series(map(str, range(1000, 101_000))).sample(frac=1)
%%timeit
sorted(set(A).union(B))
# 107 ms ± 4.82 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
sorted(set(A.tolist()).union(B.tolist()))
# 71 ms ± 4.61 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
np.union1d(A, B).tolist()
# 189 ms ± 22 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
pd.concat([A,B], axis=0).drop_duplicates().sort_values(ascending=True).tolist()
# 152 ms ± 5.47 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
输入已排序的时间:
# set union
64.5 ms ± 2.57 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# set union from lists
51.9 ms ± 2.29 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# numpy.union1d
134 ms ± 2.16 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)