我有一个大熊猫数据框,其简化形式如下:

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/

10-10 22:38