Для следующих данных:
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)
Цикл работает вечно из-за размера данных, и я ищу более быстрый путь.