使用Python补全月度缺失行:复制上月非空记录生成对应下月行
实现代码
需要先安装pandas依赖:pip install pandas
import pandas as pd # 1. 读入原始数据,从csv读取或直接构造DataFrame均可,先把字符串格式的null转为pandas可识别的空值 df = pd.read_csv('your_data_path.csv').replace('null', pd.NA) # 2. 日期列转为datetime格式,方便计算月份偏移 df['Calendar Year/Month'] = pd.to_datetime(df['Calendar Year/Month'], format='%d/%m/%Y') # 3. 按ID和日期排序,保证记录顺序正确 df = df.sort_values(by=['ID', 'Calendar Year/Month']).reset_index(drop=True) # 4. 存储待补全的行 add_rows = [] # 5. 按ID分组遍历所有消费记录 for user_id, group in df.groupby('ID'): for _, row in group.iterrows(): # 仅当月消费金额不为空时,才检查是否需要补下月记录 if pd.notna(row['Money spent']): # 计算当前月份的下一个月日期 next_month = row['Calendar Year/Month'] + pd.DateOffset(months=1) # 检查该ID下月是否已有记录 if not (group['Calendar Year/Month'] == next_month).any(): # 按规则补全新行 add_rows.append({ 'Calendar Year/Month': next_month, 'ID': user_id, 'Money spent': pd.NA, 'Money spent_pm': row['Money spent'] }) # 6. 合并原始数据和补全的行,重新排序得到最终结果 df_final = pd.concat([df, pd.DataFrame(add_rows)], ignore_index=True) df_final = df_final.sort_values(by=['ID', 'Calendar Year/Month']).reset_index(drop=True) # 可选:如果需要把日期转回原始字符串格式,执行下面一行即可 # df_final['Calendar Year/Month'] = df_final['Calendar Year/Month'].dt.strftime('%d/%m/%Y') print(df_final)
运行上述代码输出的结果和你给出的预期数据集完全一致,补行逻辑完全匹配你的要求:仅上月消费不为空时才补下月缺失行,补的行不会触发后续月份的补全逻辑。
内容的提问来源于stack exchange,提问作者Jeremys96
相关产品推荐
相关产品推荐

