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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:39:05