Использование multiply.outer
с numpy.ravel
:
a = pd.Series([1, 2, 3])
b = pd.Series([4, 5, 6])
c = pd.Series(np.multiply.outer(a, b).ravel())
Или используйте numpy.repeat
с numpy.tile
:
c = pd.Series(a.repeat(len(b)).values * np.tile(b, len(a)))
print (c)
0 4
1 5
2 6
3 8
4 10
5 12
6 12
7 15
8 18
dtype: int64
EDIT:
Спасибо shivsn
за использование предложения numpy.outer
:
c = pd.Series(np.outer(a, b).ravel())
Задержка
np.random.seed(2018)
N = 10000
a = pd.Series(np.random.randint(1000, size=N))
b = pd.Series(np.random.randint(1000, size=N))
In [81]: %timeit pd.Series(np.outer(a, b).ravel())
1 loop, best of 3: 174 ms per loop
In [82]: %timeit pd.Series(np.multiply.outer(a, b).ravel())
10 loops, best of 3: 174 ms per loop
In [83]: %timeit pd.Series(a.repeat(len(b)).values * np.tile(b, len(a)))
1 loop, best of 3: 1.2 s per loop
In [84]: %%timeit
...: index = pd.MultiIndex.from_product([a , b], names = ["a", "b"])
...: df = pd.DataFrame(index = index).reset_index()
...: df['a'] * df['b']
...:
1 loop, best of 3: 3.01 s per loop