У меня есть большой массив данных pandas, который в упрощенном виде выглядит так:
names = ['P1', 'P2', 'P3']
clusters = [1, 1, 2]
df = pd.DataFrame(clusters, names).reset_index()
df.columns=['names', 'cluster']
print(df)
names cluster
0 P1 1
1 P2 1
2 P3 2
Я хочу создать новый фрейм данных или массив df_, который выглядит следующим образом:
names P1 P2 P3
names
P1 1 1 0
P2 1 1 0
P3 0 0 1
Если значения ячеек указывают, имеют ли каждая пара (P1 / P2, P1 / P3, P2 / P3 и т. Д.) Одинаковое значение «кластера» в исходном кадре данных (df).
Я смог добиться этого с помощью грубой силы с помощью функции iterrows:
df_ = pd.DataFrame(index=df['names'], columns=df['names'])
df_ = df_.fillna(0)
for index, row in df.iterrows():
for index2, row2 in df.iterrows():
if row['cluster'] == row2['cluster']:
df_.iloc[index, index2] += 1
else:
continue
Но мои фактические данные очень большие (2500 строк), что делает их слишком медленными. Я знаю, что векторизация или лямбда-функции были бы предпочтительнее с точки зрения производительности, но я не уверен, с чего начать, если есть функции панд, о которых я не знаю, которые могут быть полезными, или если есть библиотеки, отличные от панд, которые могут быть более удобными к этой проблеме. Любые советы будут высоко оценены.