这是我的第一篇文章,请耐心等待。我需要一些帮助来优化下面的一行
pd_df.loc[flag, 'COL_{}'.format(col_number)] = pd_df.loc[flag,'COL{}'.format(col_number)].apply(lambda x: x + str(userid) + "@")
pd_df:Panda数据帧包含2M行
flag=numpy一维布尔数组,一次过滤/更新pd_df中的多行
COL_{}.format(COL_number)=根据循环(如COL_1、COL_5到COL_15)的主列的随机列数(长度为5000个字符的数据类型字符串)
一般来说,这段代码的作用是,首先根据要更新的标志和列(根据列号)过滤要更新的行,然后在这些多行和单列中附加用户id列表,并使用@作为分隔符。例如@userid1@userid2@userid2等等
由于pandas数据帧loc功能较慢,行数较多,例如2M,这行代码占用了我总时间的75%
有人能帮我把这篇文章转换成更优化的方式,比如dictionary/numpy数据类型吗
下面是代码正在创建的上面的输出。根据与国家和类别相关的用户id,其用户id将附加到该列编号。假设Col_1最多可以包含userid3,column2最多可以包含userid7,以此类推,直到col15
提前谢谢
问候,, 利瓦
同意
apply()
可以很慢。您希望尽可能利用矢量化操作。尝试使用连接运算符(+
)。这能更快吗此外,不确定这是否有帮助,但其中一些字符串应该预先计算(可能Python已经在缓存它们,但万一没有):
有两点:
f-strings始终比
str.format
快,请尽可能使用它们:似乎
userid
独立于数据帧,我不确定为什么要使用apply
,只需使用broadcasting:所以最后的方法可能是这样的:
apply
是对每个项运行函数的较慢方式之一相关问题 更多 >
编程相关推荐