Серия Pandas - Как использовать функции вложенным способом? - PullRequest
0 голосов
/ 24 апреля 2018

Когда я пытался использовать простое умножение на серии Панд, я получал индекс для индексации результата следующим образом:

pd.Series([1, 2, 3]) * pd.Series([4, 5, 6])
>>> 0    4
    1    10
    2    18

Я хочу сделать эту операцию "вложенным" способом, подобным этому:

>>> 0    4
    1    5
    2    6
    3    8
    4    10
    5    12
    6    12
    7    15
    8    18

Есть ли способ сделать это способом numpy или pandas? Или мне нужно использовать для петель? Если я использую циклы for в больших наборах данных, этот процесс занимает очень много времени.

Кроме того, как я могу использовать этот метод с различными функциями? Спасибо за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Вы можете использовать pd.MultiIndex.from_product метод.

In[1]:
a = [1, 2, 3]
b = [4, 5, 6]

index = pd.MultiIndex.from_product([a , b], names = ["a", "b"])
df = pd.DataFrame(index = index).reset_index()
dataf = pd.DataFrame({"Result" : df['a'] * df['b']})

Выход

Out[1]:
      Result
0       4
1       5
2       6
3       8
4      10
5      12
6      12
7      15
8      18
0 голосов
/ 24 апреля 2018

Одним из эффективных способов является использование numpy:

a = pd.Series([1, 2, 3])
b = pd.Series([4, 5, 6])

c = pd.Series((b.values * a.values[:, None]).ravel())

Результат:

0     4
1     5
2     6
3     8
4    10
5    12
6    12
7    15
8    18
dtype: int64
0 голосов
/ 24 апреля 2018

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...