Pandas DataFrame新增上月月末Mark值列的实现方法咨询
解决方案
实现逻辑
- 先把日期列转为pandas datetime格式,方便后续月份维度的计算
- 提取每个
Found分组下对应月份的月末Mark值 - 对每个
Found分组的月末Mark值做下移1行的偏移,得到上月的月末Mark值 - 将月末和上月月末的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
相关产品推荐
相关产品推荐

