gpt4 book ai didi

Python Pandas : . 申请永远?

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:15 28 4
gpt4 key购买 nike

我有一个通过解析大小为 1.4G 的 CSV 创建的 DataFrame“clicks”。我正在尝试使用应用功能创建一个新列“已购买”。

clicks['bought'] = clicks['session'].apply(getBoughtItemIDs)

在 getBoughtItemIDs 中,我正在检查“buys”数据框是否有我想要的值,如果有,则返回一个连接它们的字符串。 getBoughtItemIDs 中的第一行一直占用。有什么方法可以让它更快?

def getBoughtItemIDs(val):
boughtSessions = buys[buys['session'] == val].values
output = ''
for row in boughtSessions:
output += str(row[1]) + ","
return output

最佳答案

有一些因素会导致这段代码运行缓慢。

  • apply 本质上只是 for 循环遍历列的行的语法糖。在您的函数中还有一个明确的 for 循环遍历 NumPy 数组(for row in boughtSessions 部分)。最好尽可能避免以这种(非矢量化)方式循环,因为它会严重影响性能。

  • buys[buys['session'] == val].values 正在为每行 clicks 在整个列中查找 val 然后返回一个子数据帧然后创建一个新的 NumPy 数组。以这种方式反复查找值是昂贵的(O(n) 每次查找的复杂性)。创建新数组的成本很高,因为每次都必须分配内存并复制数据。

如果我了解您要执行的操作,您可以尝试使用以下方法来获取新列。

首先使用groupby 根据'session' 中的值对buys 的行进行分组。 apply 用于连接每个值的字符串:

boughtSessions = buys.groupby('session')[col_to_join].apply(lambda x: ','.join(x))

其中 col_to_joinbuys 中的列,其中包含您想要连接在一起的值。

groupby 意味着只需要通过 DataFrame 一次,并且在 Pandas 中得到了很好的优化。这里不可避免地要使用 apply 来连接字符串,但只需要一次遍历分组值。

boughtSessions 现在是一系列字符串,由“session”列中的唯一值索引。这很有用,因为查找 Pandas 索引的复杂度为 O(1)

要将 boughtSessions 中的每个字符串与 clicks['session'] 中的接近值相匹配,您可以使用 map。与 apply 不同,map 是完全矢量化的,应该非常快:

clicks['bought'] = clicks['session'].map(boughtSessions)

关于Python Pandas : . 申请永远?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29063338/

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