我有一种情况,我想将数据帧的一列中的每个值与同一列中的每个其他值进行比较。在这种情况下,对于每种产品,我想查看每个仓库中现代汽车与起亚汽车的比较
我想要比较大约 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")
自身合并并删除重复项:
_df = df.merge(df, on='warehouse')
_df = _df[lambda d: d['productid_x'] != d['productid_y']]
但是,通过 group-by 可能可以更好地解决这个问题。