Лучший способ умножить два кадра данных панд на условные столбцы - PullRequest
0 голосов
/ 24 октября 2018

У меня есть df1, для которого мне нужно добавить дополнительный столбец для произведения df1.Amount и столбец df2, условный в строках df1.Q.

Мое решение, приведенное ниже, хорошо работает для низких значенийn, но при n = 100000 решение занимает больше времени, чем вложенное, если в Excel.

import pandas as pd
import numpy as np
import time

def iRw(Q,T):
    vol = 'R' if Q in ['q1','q2','q3'] else 'L' if Q == 'q4' else 'H'
    w = float(df2.loc[(df2.T == T), vol].values)
    return w

n = 10000
Q = ['q1','q2','q3','q4','q5']
T = ['t1','t2','t3','t4','t5']

df1 = pd.DataFrame({'Id': [i for i in range(n)],
                     'Q': [Q[np.random.randint(len(Q))] for i in range(n)],
                     'T': [T[np.random.randint(len(T))] for i in range(n)],
                     'Amount': np.random.randn(n)})

df2 = pd.DataFrame({'Tenor': T,
                   'R':np.random.randn(len(T)),
                   'L':np.random.randn(len(T)),
                   'H':np.random.randn(len(T))})

tic = time.time()
df1['Product'] = df1.apply(lambda x: x.Amount * iRw(x.Q, x.T), axis = 1)
toc = time.time()

print(toc-tic)

Может кто-нибудь порекомендовать более быстрый метод, который сокращает время процесса, описанное выше?

Заранее спасибо

1 Ответ

0 голосов
/ 24 октября 2018

Использование lookup с помощником Series, созданным map:

d1 = dict.fromkeys(['q1','q2','q3'], 'R')
d = {**{'q4':'L'}, **d1}
print (d)
{'q4': 'L', 'q1': 'R', 'q2': 'R', 'q3': 'R'}

g = df1['Q'].map(d).fillna('H')

df1['Product1'] = df2.set_index('T').lookup(df1['T'], g) * df1['Amount']
print (df1.head(5))
   Id       Q    T    Amount    Product   Product1
0   0       q4   t5 -0.220341  0.145460  0.145460
1   1       q5   t1 -1.495181 -1.450221 -1.450221
2   2       q4   t3 -2.233968  0.368787  0.368787
3   3       q3   t4  1.859870 -0.785868 -0.785868
4   4       q2   t1  0.349115  0.067482  0.067482

Подробности :

print (g.head(5))
0    L
1    H
2    L
3    R
4    R
Name: Q, dtype: object

Настройка :

np.random.seed(456)

n = 10000
Q = ['q1','q2','q3','q4','q5']
T = ['t1','t2','t3','t4','t5']

df1 = pd.DataFrame({'Id': [i for i in range(n)],
                     'Q': [Q[np.random.randint(len(Q))] for i in range(n)],
                     'T': [T[np.random.randint(len(T))] for i in range(n)],
                     'Amount': np.random.randn(n)})

df2 = pd.DataFrame({'Tenor': T,
                   'R':np.random.randn(len(T)),
                   'L':np.random.randn(len(T)),
                   'H':np.random.randn(len(T))})
...