如何有效地合并两个 pd.Series

问题描述 投票:0回答:1

我有两个

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
来联合它们?

python pandas performance optimization series
1个回答
0
投票

如果您首先转换为列表,集合操作可能会非常高效、更快:

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)
© www.soinside.com 2019 - 2024. All rights reserved.