我有一个大熊猫数据框,其简化形式如下:
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行),这使得速度过慢。我知道矢量化或lambda函数出于性能方面的考虑会更可取,但是我不确定如何启动,如果我不知道有熊猫函数可能有用,或者除了熊猫之外还有其他库可能更适合这个问题。任何提示将不胜感激。
最佳答案
您可以merge
,然后使用.crosstab
import pandas as pd
m = df.merge(df, on='cluster')
pd.crosstab(m.names_x, m.names_y)
names_y P1 P2 P3
names_x
P1 1 1 0
P2 1 1 0
P3 0 0 1
如果您需要将其作为配对的
boolean
而不是计数,则将.clip(upper=1)
添加到末尾。关于python - 在Pandas/Python中优化比较行操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53267934/