如何利用Pandas生成基于同SKU前一行End值的Start列?
高效生成Pandas的Start列方案
问题背景
现有如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame({ 'sku': ['A', 'A', 'B', 'B', 'C', 'C'], 'date': ['2022-08-29', '2022-08-30', '2022-08-29', '2022-08-30', '2022-08-29', '2022-08-30'], 'End': [100, 110, 0, 210, 300, 310]})
需要创建Start列,规则为:同一sku下当日的Start值等于前一日的End值,仅对存在前序日期的行生效;每个sku的首个日期行无需设置Start值,预期结果如下:
sku date End Start 0 A 2022-08-29 100 1 A 2022-08-30 110 100 2 B 2022-08-29 0 3 B 2022-08-30 210 0 4 C 2022-08-29 300 5 C 2022-08-30 310 300
原方案用for循环效率低下,需要用Pandas的矢量化操作实现高效处理。
高效实现方案
直接使用groupby按sku分组,对End列执行shift(1)操作,就能快速生成Start列,代码如下:
df['Start'] = df.groupby('sku')['End'].shift(1)
代码说明
groupby('sku'):按商品sku分组,确保只在同一sku内部进行数据偏移shift(1):将每组内的End值向下偏移一行,刚好让下一行的Start等于上一行的End- 首个日期的行因为没有前序数据,会自动填充为
NaN,如果需要和示例一样显示为空字符串,可补充一步:
df['Start'] = df.groupby('sku')['End'].shift(1).fillna('')
这种矢量化操作比for循环效率高几个数量级,尤其适合处理大型数据集,执行后即可得到与预期完全一致的结果。
内容的提问来源于stack exchange,提问作者Martin Clausse
相关产品推荐
相关产品推荐

