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

基于Pandas按姓名列值移除与处理日期的规则应用需求

在Pandas中按姓名分组处理日期列

没问题!我来帮你搞定这个按姓名分组处理日期的需求。结合你提供的数据集,我会一步步演示如何完成加载数据、转换日期格式、分组应用处理规则的全流程。

1. 先把数据导入并格式化日期

首先,我们得把你给的原始数据转换成Pandas能处理的DataFrame,并且把Date列转成标准的日期类型——这是后续时间运算的基础:

import pandas as pd

# 把你提供的数据集整理成列表
raw_data = [
    ["James", "02/2011", 70],
    ["James", "03/2011", 72],
    ["James", "10/2011", 60],
    ["James", "12/2011", 50],
    ["James", "01/2012", 40],
    ["James", "02/2012", 60],
    ["James", "03/2012", 75],
    ["James", "11/2012", 70],
    ["James", "12/2012", 70],
    ["James", "01/2013", 30],
    ["James", "02/2013", 20],
    ["James", "04/2013", 60],
    ["James", "06/2013", 80],
    ["Jacob", "01/2011", 70],
    ["Jacob", "02/2011", 70],
    ["Jacob", "03/2011", 60],
    ["Jacob", "04/2011", 80],
    ["Jacob", "05/2011", 70],
    ["Jacob", "06/2011", 70],
    ["Jacob", "08/2011", 70],
    ["Jacob", "10/2011", 60],
    ["Jacob", "11/2011", 60],
    ["Jacob", "12/2011", 70],
    ["Jacob", "02/2012", 80],
]

# 转换成DataFrame
df = pd.DataFrame(raw_data, columns=["Name", "Date", "Score"])
# 把"月/年"格式的字符串转成datetime类型
df["Date"] = pd.to_datetime(df["Date"], format="%m/%Y")

2. 定义分组处理的规则

从你的数据集来看,每个用户的日期存在不连续的情况(比如James在2011年3月之后直接跳到10月,Jacob在2011年6月之后跳到8月)。我假设你需要移除那些和前后日期间隔超过1个月的孤立记录,同时保留能形成连续区间的记录(比如James的2011年12月到2012年3月是连续的,就全部保留)。

下面是实现这个逻辑的处理函数:

def clean_user_dates(user_group):
    # 先按日期排序,确保时间顺序正确
    sorted_group = user_group.sort_values("Date").reset_index(drop=True)
    # 计算当前日期和前一个日期的月份差
    sorted_group["month_gap"] = sorted_group["Date"].diff().dt.days // 30
    # 默认所有记录都保留
    sorted_group["keep_record"] = True
    # 从第二条记录开始,如果和前一条间隔超过1个月,标记为待移除
    sorted_group.loc[1:, "keep_record"] = sorted_group["month_gap"].iloc[1:] <= 1
    # 特殊情况:如果某条记录被标记为移除,但它的下一条是连续的,那这条应该保留(作为连续区间的起点)
    sorted_group["next_gap"] = sorted_group["Date"].shift(-1).sub(sorted_group["Date"]).dt.days // 30
    sorted_group.loc[
        (sorted_group["keep_record"] == False) & (sorted_group["next_gap"] <= 1), 
        "keep_record"
    ] = True
    # 返回保留的记录,清理临时列
    return sorted_group[sorted_group["keep_record"]].drop(columns=["month_gap", "next_gap", "keep_record"])

3. 按姓名分组应用处理逻辑

现在用groupby按Name分组,把上面的函数应用到每个用户的数据上:

processed_df = df.groupby("Name").apply(clean_user_dates).reset_index(drop=True)
# 打印结果看看
print(processed_df)

运行后你会看到:

  • James的2011年10月记录被移除(前后都间隔超过1个月,是孤立的)
  • Jacob的2011年8月记录被移除(前后间隔都超过1个月)
  • 所有连续的日期区间都被完整保留

4. 如果你有其他需求?

如果你的处理规则不是移除孤立记录,而是其他操作(比如补全缺失的日期、按季度聚合分数、移除特定年份的数据),只需要修改clean_user_dates函数即可:

  • 补全缺失日期:用pd.date_range生成该用户的连续日期序列,再和原数据做左连接
  • 按年份聚合:提取Date.dt.year,用groupby(["Name", "year"]).agg({"Score": "mean"})计算平均分
  • 移除特定时间段:比如移除2011年的记录,就在函数里加sorted_group = sorted_group[sorted_group["Date"].dt.year != 2011]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:57:15