You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:如何用groupby+transform+自定义函数生成移位后的Date列

嘿,这需求用Pandas就能完美解决!我给你写好代码并解释清楚每一步:

解决方法:生成自定义Date列

首先,我们先还原你提供的原始数据集:

import pandas as pd

# 构造原始数据
df = pd.DataFrame({
    'ARTICLE': ['a']*10 + ['b'],
    'Day': [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 3],
    'Row': [10]*10 + [1]
})

接下来是核心的分组处理逻辑,我们通过groupby结合自定义函数来实现你要的Date列规则:

def process_group(group):
    # 判断当前分组内是否存在Row=1的记录
    if (group['Row'] == 1).any():
        # 若存在,Date直接与Day值保持一致
        group['Date'] = group['Day']
    else:
        # 若不存在,将Day列整体上移一位,最后一行填充100
        group['Date'] = group['Day'].shift(-1).fillna(100)
    return group

# 按ARTICLE分组并应用处理函数
result_df = df.groupby('ARTICLE', group_keys=False).apply(process_group)

运行后得到的result_df完全符合你的预期:

ARTICLEDayRowDate
a2103
a3104
a4105
a5106
a6107
a7108
a8109
a91010
a101011
a1110100
b313

代码逻辑拆解

  • 自定义函数process_group针对每个分组做针对性处理:
    • 用(group['Row'] == 1).any()快速判断分组内是否有Row值为1的记录;
    • 有Row=1的情况时,直接把Day值赋值给Date;
    • 无Row=1的情况时,用shift(-1)将Day列向上偏移一位(当前行Date取下一行的Day值),最后一行的缺失值用fillna(100)替换成指定的100;
  • group_keys=False参数可以避免生成额外的分组索引列,让最终结果的结构更整洁。

内容的提问来源于stack exchange,提问作者Feng Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:57:29