微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python Pandas:.apping是否永久使用?

我有一个通过解析大小为1.4G的CSV创建的DataFrame’clicks’.我正在尝试使用Apply函数创建一个“已购买”的新列.

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循环的语法糖.函数中还有一个NumPy数组的显式for循环(buySessions部分中的for行).最好尽可能避免以这种方式(非矢量化)循环,因为这会严重影响性能.
> buys [buys [‘session’] == val].values在每一行点击的整个列中查找val,然后返回子DataFrame,然后创建一个新的NumPy数组.以这种方式重复查找值非常昂贵(每次查找的复杂度为O(n)).由于必须分配内存,并且每次都要复制数据,因此创建新阵列将非常昂贵.

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

首先使用groupby按“会话”中的值对购买行进行分组. apply用于为每个值连接字符串:

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

其中col_to_join是“ buys”中的列,其中包含您要一起连接到字符串中的值.

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

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

为了使buySessions中的每个字符串与clicks [‘session’]中的方法值相匹配,您可以使用map.与apply不同,map是完全矢量化的,应该非常快:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐