У меня очень большой фрейм данных, пример которого выглядит следующим образом:
df = pd.DataFrame({'From':['a','b','c','a','d'], 'To':['b', 'c', 'a', 'd', 'e'], 'Rates':[1e-4, 2.3e-2, 1e-2, 100, 70]})
In[121]: df
Out[121]:
From To Rates
0 a b 0.0001
1 b c 0.0230
2 c a 0.0100
3 a d 100.0000
4 d e 70.0000
Конечный результат, который я хотел бы получить, - n x n
матрица model_matrix
(где n
= len(df)
) это выглядит следующим образом:
a b c d e
a 0.00 0.0001 0.000 100.0 0.0
b 0.00 0.0000 0.023 0.0 0.0
c 0.01 0.0000 0.000 0.0 0.0
d 0.00 0.0000 0.000 0.0 70.0
e 0.00 0.0000 0.000 0.0 0.0
Следующий код работает путем преобразования df
в словарь transfer_rates
и заполнения model_matrix
значениями из словаря, но это очень неэффективно для большой df
.
from_comps = list(df['From'])
to_comps = list(df['To'])
transfer_rates = {}
for from_comp in from_comps:
for to_comp in to_comps:
try:
transfer_rates[from_comp, to_comp] = df.loc[(df['From'] == from_comp) & (df['To'] == to_comp)]['Rates'].values[0]
except:
pass
all_comps = sorted(set(from_comps+to_comps))
model_matrix = pd.DataFrame(columns=sorted(all_comps),index=sorted(all_comps))
for rate in transfer_rates:
model_matrix[rate[1]][rate[0]] = transfer_rates[rate]
model_matrix.fillna(0, inplace=True)
Есть ли более эффективный способ сделать это?