我有一个熊猫数据框架,包括一个电子商务网站的项目。我正在使用如下函数检查数据框中的项是否在随后的(向前看)或之前的(向后看)天仍然存在:
#get a unique set of product urls for the next 2 days. If the current row's URL is in that set, mark it as 0 (not expiring); otherwise mark it 1 (expiring).
def is_expiring_product(row):
if row.childurl in df[(df['date'] > row['date']) & (df['date'] < (row['date'] + np.timedelta64(2,"D")) ) ].childurl.unique():
row.is_expiring_product = 0
else:
row.is_expiring_product = 1
return row
问题是,这需要时间(24小时以上,如果它完成的话)才能应用到一帧超过1M的记录上。你知道吗
直觉告诉我一定有更有效的方法。。。你知道吗
也许为每一天创建一个单独的包含唯一URL的数据帧,然后在该数据帧上而不是在更大的帧上搜索?我不知道为什么会更快。。。你知道吗
代码#1的示例:Compute是否为单个日期到期产品
对于测试,我使用了以下数据帧(date列的类型是datetime64[ns]):
起点是定义两个变量,用于切割df, 按日期,放入垃圾箱(过去、今天和未来):
假设我们只计算2019-09-12年的到期产品, 因此,首先要设置currDate(也将用于切割):
然后在addis\u expiring\u product列中,首先填充空字符串:
计算桶-将日期切割到桶中的结果:
下一步是计算dfu current的一个子集 “当前”日期:
要为“其他”日期在行中生成urls的索引,请运行:
最后一步是为is\u expiring\u product生成值 更新此列:
结果是:
结果说明:
代码#2的示例:Compute是否为所有日期的产品过期
源数据帧是相同的,从定义dMin和dMax开始 和以前一样。你知道吗
然后定义以下函数来设置过期状态:
整个计算归结为一条指令, 将此功能应用于每个组(每个日期):
需要额外调用droplevel(0),因为 应用具有多索引:
因此,为了保存在df(使用“普通”索引),顶层 必须删除多重索引的。你知道吗
这次的结果是:
另一个更简单、更快的解决方案
请注意,不需要为计算产品是否过期 每行分开。你知道吗
更简单、更快、完全不同的解决方案是:
此解决方案的工作原理如下:
上述整个操作可另存为一条指令:
结果和以前一样。你知道吗
请写一个评论,执行上面的内容需要多长时间 数据帧上的指令以及它有多少行。你知道吗
相关问题 更多 >
编程相关推荐