如何使用pandas实现客户数据按日期连续规则分组
Pandas实现日期相邻分组方案
核心逻辑
- 先对日期列做格式转换,保证可计算日期差
- 按客户字段独立分组处理,保证不同客户的分组不互通
- 对每个客户的日期排序后计算相邻行的日期差,差值超过1天时标记为新分组起点,累加标记值得到分组ID
完整可运行代码
import pandas as pd from string import ascii_uppercase # 1. 构造示例数据,你也可以替换为pd.read_xxx读取自己的数据源 data = [ ["Customer A1", "1/1/2020"], ["Customer A1", "1/1/2020"], ["Customer A1", "2/1/2020"], ["Customer A1", "3/1/2020"], ["Customer A1", "3/1/2020"], ["Customer A1", "5/1/2020"], ["Customer A1", "10/1/2020"], ["Customer A1", "13/1/2020"], ["Customer A1", "14/1/2020"], ["Customer A1", "20/1/2020"], ["Customer B1", "21/1/2020"], ["Customer B1", "22/1/2020"], ["Customer B1", "24/1/2020"], ["Customer B1", "27/1/2020"], ["Customer B1", "28/1/2020"], ] df = pd.DataFrame(data, columns=["customer", "date"]) # 2. 转换日期格式,适配日/月/年的输入格式 df["date"] = pd.to_datetime(df["date"], dayfirst=True) # 3. 定义分组规则函数 def generate_group(customer_df): # 先按日期排序,保证顺序正确 customer_df = customer_df.sort_values("date", ignore_index=True) # 计算相邻行的日期差,第一行空值填充为0 date_diff = customer_df["date"].diff().dt.days.fillna(0) # 差值超过1天则触发新分组,累加得到数字分组ID group_num = (date_diff > 1).cumsum() # 转换为A/B/C的字母分组,不需要可以删掉直接用group_num customer_df["group"] = group_num.map(lambda x: ascii_uppercase[x]) return customer_df # 4. 按客户分组应用规则 df = df.groupby("customer", group_keys=False).apply(generate_group) # 输出结果验证 print(df)
结果说明
运行后输出的group列和需求示例完全一致,不同客户的分组编号独立重置,日期差≤1天的记录都会被划分到同一个分组。
内容的提问来源于stack exchange,提问作者duyvan
相关产品推荐
相关产品推荐

