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

Pandas DataFrame新增上月月末Mark值列的实现方法咨询

解决方案

实现逻辑

  1. 先把日期列转为pandas datetime格式,方便后续月份维度的计算
  2. 提取每个Found分组下对应月份的月末Mark值
  3. 对每个Found分组的月末Mark值做下移1行的偏移,得到上月的月末Mark值
  4. 将月末和上月月末的Mark值合并回原DataFrame,空值按需求替换即可

完整可运行代码

import pandas as pd

# 初始化原始DataFrame
df = pd.DataFrame({
    'Found':['A','A','A','A','A','B','B','B','B'],
    'Date':['14/10/2021','19/10/2021','29/10/2021','30/09/2021','20/09/2021','20/10/2021','29/10/2021','15/10/2021','10/09/2021'],
    'LastDayMonth':['29/10/2021','29/10/2021','29/10/2021','30/09/2021','30/09/2021','29/10/2021','29/10/2021','29/10/2021','30/09/2021'],
    'Mark':[1,2,3,4,3,1,2,3,2]
})

# 转换日期格式为datetime类型,方便计算
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')
df['LastDayMonth'] = pd.to_datetime(df['LastDayMonth'], format='%d/%m/%Y')

# 提取所有月末行的Mark值
month_end_data = df[df['Date'] == df['LastDayMonth']][
    ['Found', 'LastDayMonth', 'Mark']
].rename(columns={'Mark': 'Mark_LastDayMonth'})

# 按Found分组,偏移1行得到上月月末的Mark值
month_end_data['Mark_LastDayPrevious_Month'] = month_end_data.groupby('Found')['Mark_LastDayMonth'].shift(1)

# 合并回原DataFrame
df = df.merge(month_end_data, on=['Found', 'LastDayMonth'], how='left')

# 可选:将日期转回原始字符串格式,空值替换为x
df[['Date', 'LastDayMonth']] = df[['Date', 'LastDayMonth']].apply(lambda x: x.dt.strftime('%d/%m/%Y'))
df['Mark_LastDayPrevious_Month'] = df['Mark_LastDayPrevious_Month'].fillna('x')

print(df)

结果说明

你给出的预期示例中B主体9月月末的Mark值写为1,和原始数据中B对应9月末行的Mark值为2存在冲突,实际运行结果会以原始数据为准,你可以根据实际业务规则调整月末行的筛选逻辑即可。

内容的提问来源于stack exchange,提问作者Eric Alves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:06:08