Python DataFrame缺失月份查找与列值拆分补全实现方案
实现代码及说明
首先确保你已经安装了pandas库,以下是可直接运行的完整代码:
import pandas as pd # --------------- 数据读入部分 --------------- # 示例构造数据,你实际使用时替换为pd.read_csv等方法读入实际数据即可 df = pd.DataFrame([ ['12-10-2020', 121134, None, None, 'JP'], ['06-11-2020', 120859, 350, 75, 'JP'], ['18-12-2020', 101857, 19128, 126, 'JP'], ['29-01-2021', 105760, 5029, 8932, 'JP'], ['16-02-2021', 115437, 1279, 10956, 'JP'], ['01-03-2021', 115512, 517, 592, 'JP'], ['12-07-2021', 137546, 18074, 40108, 'JP'], ['11-08-2021', 134319, 23753, 20526, 'JP'], ['02-09-2021', 130156, 4355, 192, 'JP'] ], columns=['Date', 'Emailable', 'Lost_Fans', 'New_Fans', 'Country']) # --------------- 核心处理逻辑 --------------- # 1. 日期格式标准化,按时间排序 df['Date'] = pd.to_datetime(df['Date'], format='%d-%m-%Y') df = df.sort_values('Date').reset_index(drop=True) # 提取年月作为分组维度 df['year_month'] = df['Date'].dt.to_period('M') # 2. 生成完整年月序列,找出所有缺失月份 all_year_month = pd.period_range( start=df['year_month'].min(), end=df['year_month'].max(), freq='M' ) country_val = df['Country'].iloc[0] # 3. 补全缺失月份的空行 full_data = [] for ym in all_year_month: match_row = df[df['year_month'] == ym] if len(match_row): full_data.append(match_row.iloc[0].to_dict()) else: # 缺失月份日期取当月最后一天,Emailable填0,Country保持原值 full_data.append({ 'Date': ym.to_timestamp(how='end'), 'Emailable': 0, 'Lost_Fans': None, 'New_Fans': None, 'Country': country_val, 'year_month': ym }) full_df = pd.DataFrame(full_data).reset_index(drop=True) # 4. 按规则拆分Lost_Fans、New_Fans值 # 标记分组:每组以有原始粉丝数据的行作为结束点 full_df['group_id'] = full_df['Lost_Fans'].notna().shift(fill_value=False).cumsum() # 分组计算拆分后的值 for group_id, group_df in full_df.groupby('group_id'): end_row = group_df.iloc[-1] period_cnt = len(group_df) if pd.isna(end_row['Lost_Fans']) or pd.isna(end_row['New_Fans']): continue # 按总月份数均分,示例取整,需要小数把//换成/即可 split_lost = end_row['Lost_Fans'] // period_cnt split_new = end_row['New_Fans'] // period_cnt # 给分组内所有行赋值 full_df.loc[group_df.index, ['Lost_Fans', 'New_Fans']] = split_lost, split_new # 5. 输出格式化,和示例格式对齐 full_df['Date'] = full_df['Date'].dt.strftime('%d-%m-%Y') full_df = full_df.drop(columns=['year_month', 'group_id']) # --------------- 结果输出 --------------- print(full_df.to_string(index=False))
注意事项
- 如果数据包含多个国家,在核心逻辑前按
Country字段分组,每个国家单独执行上述处理即可 - 代码默认按整除取整,如需保留小数把
//替换为/即可 - 缺失月份的日期默认取当月最后一天,和你给出的示例规则一致
内容的提问来源于stack exchange,提问作者nikki
相关产品推荐
相关产品推荐

