Панды Groupby применить оптимизацию цикла - PullRequest
0 голосов
/ 09 октября 2018

Для следующих данных:

index        bond          stock          investor_bond        inverstor_stock                            
0            1               2               A                   B
1            1               2               A                   E
2            1               2               A                   F
3            1               2               B                   B
4            1               2               B                   E
5            1               2               B                   F
6            1               3               A                   A
7            1               3               A                   E
8            1               3               A                   G
9            1               3               B                   A
10           1               3               B                   E
11           1               3               B                   G
12           2               4               C                   F
13           2               4               C                   A
14           2               4               C                   C
15           2               5               B                   E
16           2               5               B                   B
17           2               5               B                   H

Облигация 1 имеет двух инвесторов, A, B.У stock2 есть три инвестора, B, E, F.Для каждой пары инвесторов (investor_bond, investor_stock) мы хотим отфильтровать ее, если они когда-либо инвестировали в одну и ту же облигацию / акцию.

Например, для пары (B, F) с индексом = 5мы хотим отфильтровать его, потому что они оба вложили в акции 2.

Пример вывода должен быть таким:

index  bond  stock  investor_bond  investor_stock
11      1      3      B                  G

До сих пор я пробовал использовать два цикла.

A1 = A1.groupby('bond').apply(lambda x: x[~x.investor_stock.isin(x.bond)]).reset_index(drop=True)


stock_list=A1.groupby(['bond','stock']).apply(lambda x: x.investor_stock.unique()).reset_index()
stock_list=stock_list.rename(columns={0:'s'})
stock_list=stock_list.groupby('bond').apply(lambda x: list(x.s)).reset_index()
stock_list=stock_list.rename(columns={0:'s'})
A1=pd.merge(A1,stock_list,on='bond',how='left')

A1['in_out']=False
for j in range(0,len(A1)):
for i in range (0,len(A1.s[j])):
    A1['in_out'] = A1.in_out | (
                A1.investor_bond.isin(A1.s[j][i]) & A1.investor_stock.isin(A1.s[j][i]))
print(j)

Цикл работает вечно из-за размера данных, и я ищу более быстрый путь.

...