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完全符合你的预期:
| ARTICLE | Day | Row | Date |
|---|---|---|---|
| a | 2 | 10 | 3 |
| a | 3 | 10 | 4 |
| a | 4 | 10 | 5 |
| a | 5 | 10 | 6 |
| a | 6 | 10 | 7 |
| a | 7 | 10 | 8 |
| a | 8 | 10 | 9 |
| a | 9 | 10 | 10 |
| a | 10 | 10 | 11 |
| a | 11 | 10 | 100 |
| b | 3 | 1 | 3 |
代码逻辑拆解
- 自定义函数
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
相关产品推荐
相关产品推荐

