将 Pandas Dataframe 中的一条记录与 Dataframe 中的所有其他记录进行比较

问题描述 投票:0回答:1

我有一种情况,我想将数据帧的一列中的每个值与同一列中的每个其他值进行比较。在这种情况下,对于每种产品,我想查看每个仓库中现代汽车与起亚汽车的比较

我想要比较大约 10,000 个产品(总共 500,000 条记录) - 每个产品都与数据集中的所有其他产品进行比较。

请注意,下面示例代码中仓库的连接是为了处理需要交叉连接的情况(一种产品的仓库不包含另一种产品)

我想看看是否有一种更简单/更快的方法来做到这一点,而不是按照下面的方式执行双“for”。输出是正确的,但代码需要一天多的时间才能运行。

如何最有效地完成这项工作?

import pandas as pd

data = {'productid' : ['hyundai', 'hyundai', 'hyundai', 'kia','kia', 'kia'],
    'warehouse' : ['New Jersey', 'New York', 'California', 'New Jersey', 'New York', 'California'],
    'pct_total' : [35, 45, 20,65,55,80]}
df = pd.DataFrame(data)


dfoutput2 = pd.DataFrame()
for productid1 in df.productid.unique():
    for productid2 in df.productid.unique():
        if productid1 != productid2:
            df1=df[df.productid==productid1]
            df2=df[df.productid==productid2]

            allwarehouses=pd.concat(  [df1.warehouse, df2.warehouse])
            allwarehouses=allwarehouses.drop_duplicates()
            merged1=pd.merge(allwarehouses,df1, how="left", on=["warehouse"])
            mergedfinal=pd.merge(merged1,df2, how="left", on=["warehouse"])
            mergedfinal['lowervalue'] = mergedfinal[['pct_total_x','pct_total_y']].min(axis=1)
            dfoutput2=pd.concat(  [dfoutput2, mergedfinal])
print("done")
python pandas loops compare
1个回答
0
投票

自身合并并删除重复项:

_df = df.merge(df, on='warehouse')
_df = _df[lambda d: d['productid_x'] != d['productid_y']]

但是,通过 group-by 可能可以更好地解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.