
本文介绍使用 Pandas 对数据按 Code 分组后,识别同一组内 Date 完全重复的记录,并将对应行的 Same_Month 字段统一设为 'Yes' 的高效实现方法。
本文介绍使用 pandas 对数据按 `code` 分组后,识别同一组内 `date` 完全重复的记录,并将对应行的 `same_month` 字段统一设为 `'yes'` 的高效实现方法。
在实际数据分析中,常需根据业务逻辑对重复模式进行标记——例如:当同一 Code 下多个条目具有完全相同的日期(精确到日),则视为“同日发生”,需统一打标(如 Same_Month='Yes')。注意,此处“same_month”命名虽含“month”,但根据题意和示例,实际判定依据是日期值完全一致(即 Date 字段标准化后的完整日期相同),而非仅月份相同。
✅ 解决思路
核心逻辑分三步:
- 统一日期格式:将原始 Date 列解析为标准 datetime64[ns] 类型,消除 '2023-01-02'、'01/16/2023'、'26/11/2018' 等多格式干扰;
- 识别组内重复日期:使用 duplicated(subset=['Code', 'Date'], keep=False) 标记所有在相同 Code 下 Date 值出现 ≥2 次的行(keep=False 保证所有重复项均被标记为 True);
- 批量赋值:利用布尔索引 df.loc[condition, col] = value,仅更新匹配行的 Same_Month 字段。
? 完整代码实现
import pandas as pd
# 构建原始数据
df = pd.DataFrame([
[1,'2023-01-02 00:00:00','01','2023',''],
[2,'2023-01-02 00:00:00','01','2023',''],
[3,'01/16/2023','01','2023',''],
[4,'01/17/2023','01','2023',''],
[5,'01/16/2023','01','2023',''],
[6,'02/13/2023','02','2023',''],
[7,'02/13/2023','02','2023',''],
[8,'02/13/2023','02','2023',''],
[9,'26/11/2018','11','2018',''],
[10,'26/11/2018','11','2018',''],
[11,'26/11/2018','11','2018',''],
[12,'26/11/2018','11','2018',''],
[13,'05/11/2018','11','2018',''],
[14,'09/11/2018','11','2018','']
], columns=['Number','Date','Code','year','Same_Month'])
# 步骤1:强转日期(自动适配混合格式)
df['Date'] = pd.to_datetime(df['Date'], format='mixed')
# 步骤2:识别 Code+Date 组合下的重复行(所有重复项均标记为 True)
duplicates = df.duplicated(['Code', 'Date'], keep=False)
# 步骤3:批量更新 Same_Month 字段
df.loc[duplicates, 'Same_Month'] = 'Yes'
# 查看结果(仅展示关键列便于验证)
print(df[['Number', 'Date', 'Code', 'year', 'Same_Month']])
⚠️ 注意事项
- format='mixed' 是 Pandas 2.0+ 推荐方式,可稳健解析多种常见日期格式;若使用旧版 Pandas,可改用 infer_datetime_format=True 或显式指定 format(但需确保格式统一);
- duplicated(..., keep=False) 是关键:若用默认 keep='first',则仅标记重复项中的后续行,首行会被忽略,导致漏标;
- 原始 Same_Month 列若含非空字符串(如 'No' 或其他标记),上述代码仅覆盖 True 行,其余保持原值;如需清空非重复项,可先初始化:df['Same_Month'] = '';
- 本方案不依赖 groupby().transform(),避免了聚合开销,性能更优,尤其适用于大数据集。
✅ 验证效果
运行后,编号为 4(01/17/2023)、13(05/11/2018)、14(09/11/2018)的记录因在各自 Code 组内无重复 Date,其 Same_Month 保持为空(或原始值),其余均正确标记为 'Yes'——完全符合预期。










