gpt4 book ai didi

python - 优化 pandas/python 中的比较行操作

转载 作者:太空宇宙 更新时间:2023-11-04 02:13:13 25 4
gpt4 key购买 nike

我有一个 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 行),这使得速度非常慢。我知道出于性能原因,矢量化或 lambda 函数更可取,但我不确定如何开始,如果有我不知道的 pandas 函数可能有用,或者是否有 pandas 以外的库可能更适合到这个问题。任何提示将不胜感激。

最佳答案

您可以合并然后使用.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

如果您需要它只是配对的 bool 值而不是计数,则将.clip(upper=1)添加到末尾。

关于python - 优化 pandas/python 中的比较行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53267934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com