gpt4 book ai didi

python - 以高效的方式从交易数据到集合列表

转载 作者:太空狗 更新时间:2023-10-30 01:53:26 25 4
gpt4 key购买 nike

我有一个 csv 文件,其中包含以下形式的交易数据

import pandas as pd
df = pd.DataFrame({'OrderID':[1,1,1,1,2,2], 'ItemID':[1,2,3,4,1,2]})
print(df)
ItemID OrderID
0 1 1
1 2 1
2 3 1
3 4 1
4 1 2
5 2 2

我想获取一个列表,其中包含每个 OrderID 的项目集。

这可以通过

获得
df.groupby('OrderID').apply(lambda x: set(x['ItemID'])).tolist()
[{1, 2, 3, 4}, {1, 2}]

但是,对于具有 900 万行的 csv 文件,这需要一些时间。因此,我想知道是否有更快的方法?我对使用 pandas 或直接在 .csv 文件上运行的任何解决方案感兴趣


首先,我要感谢你们,感谢你们的宝贵意见!我从我的真实数据中抽取了 50000 个 OrderId(以及相应的项目)的样本,并将其中的几种方法应用于数据集。这是结果

BenchmarkResults

请注意,我使用了 pir 程序的更新版本。所以赢家是 divakar,即使我们只考虑集合列表输出。

在我的整个数据集上,他的更快的集合方法持续时间为 5.05 秒,而他的更快的基于列表的方法持续时间仅为 2.32 秒。与最初的 115 秒相比,这是一个巨大的收获!再次感谢!

最佳答案

新方法
默认字典

from collections import defaultdict

def pir(df):
d = defaultdict(set)
for n, g in df.groupby('OrderID').ItemID:
d[n].update(g.values.tolist())

return list(d.values())

样本

df = pd.DataFrame(dict(OrderID=np.random.randint(0, 1000, 10000000),
ItemID=np.random.randint(0, 1000, 10000000)))

enter image description here


老方法

uo, io = np.unique(df.OrderID.values, return_inverse=True)
ui, ii = np.unique(df.ItemID.values, return_inverse=True)

def gu(i):
return set(ui[ii[io == i]].tolist())

[gu(i) for i in range(len(uo))]

[{1, 2, 3, 4}, {1, 2}]

老时间
代码:

def pir(df):
uo, io = np.unique(df.OrderID.values, return_inverse=True)
ui, ii = np.unique(df.ItemID.values, return_inverse=True)

def gu(i):
return set(ui[ii[io == i]].tolist())

return [gu(i) for i in range(len(uo))]

def jez(df):
arr = df.groupby('OrderID')['ItemID'].unique().values
return [set(v) for v in arr]

def div(df):
a = df.values
sidx = a[:,1].argsort(kind='mergesort')
cut_idx = np.nonzero(a[sidx[1:],1] > a[sidx[:-1],1])[0]+1
out = np.split(a[sidx,0], cut_idx)
return list(map(set,out))

def quik(df):
return df.groupby('OrderID').apply(lambda x: set(x['ItemID'])).tolist()

带有样本数据
enter image description here

有更多数据

df = pd.DataFrame(dict(OrderID=np.random.randint(0, 10, 10000),
ItemID=np.random.randint(0, 10, 10000)))

enter image description here

更多数据

df = pd.DataFrame(dict(OrderID=np.random.randint(0, 10, 10000000),
ItemID=np.random.randint(0, 10, 10000000)))

enter image description here

关于python - 以高效的方式从交易数据到集合列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40927376/

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