Самое быстрое, что я могу предложить, это следующее:
series = [s1, s2, s3]
s = pd.concat(series)
your_series = s[(~s.index[::-1].duplicated())[::-1]]
Вы можете сравнить время:
import functools
def method1(series):
s = pd.concat(series)
return s[(~s.index[::-1].duplicated())[::-1]]
def method2(series):
s1,s2,s3 = series
return functools.reduce(pd.Series.combine_first, [s3,s2,s1])
def method3(series):
s1,s2,s3 = series
listc = s3.append(s2).append(s1).reset_index().drop_duplicates(
subset='index', keep='first').set_index('index').sort_index()
return listc
def method4(series):
return pd.DataFrame(series).ffill().tail(1).T
Результаты:
>>> %timeit method1(series)
... 643 µs ± 25.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit method2(series)
... 1.15 ms ± 26.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit method3(series)
... 3.09 ms ± 262 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
>>> %timeit method4(series)
... 1.07 ms ± 16.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Конечнопоследствия применения этих подходов для памяти, возможно, стоит учитывать при применении к большому набору данных.
РЕДАКТИРОВАТЬ:
Небольшой тест для гораздо более крупных серий:
series = [pd.Series(data=np.arange(100000), index=np.arange(i*5000,100000+i*5000)) for i in range(100)]
Результат:
>>> %timeit method1(series)
... 583 ms ± 18.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit method2(series)
... 4.5 s ± 25.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Однако, если число серий меньше, а размер каждой серии больше, тогда разница намного меньше:
series = [pd.Series(data=np.arange(1000000), index=np.arange(i*5000,1000000+i*5000)) for i in range(10)]
Результат:
>>> %timeit method1(series)
... 679 ms ± 23.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit method2(series)
... 1.39 s ± 26.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Для чего-то гораздо большего, хотя вы, возможно, захотите рассмотреть другой подход, такой как уменьшение карты, как возможность.