如何在pandas DataFrame中高效统计各id_1跨12月与1月的共同id_2数量?
解决方案:统计跨月份共同出现的id_2数量
需求说明
针对每个id_1,统计其在12月和1月中共同出现的id_2的数量(即同一个id_2既在12月与id_1关联,又在1月与id_1关联)。
示例输入
| id_1 | id_2 | Date |
|---|---|---|
| 12 | 1 | 20221216 |
| 12 | 1 | 20230113 |
| 12 | 1 | 20230116 |
| 12 | 2 | 20221213 |
| 12 | 2 | 20230118 |
| 18 | 7 | 20221207 |
| 18 | 7 | 20220907 |
| 18 | 7 | 20230113 |
| 18 | 5 | 20230118 |
预期输出
| id_1 | Nb |
|---|---|
| 12 | 2 |
| 18 | 1 |
高效实现(无多次Merge)
可以通过分组统计+条件过滤的方式实现,全程仅需一次数据扫描和分组操作,避免多次Merge。以下是SQL实现代码:
SELECT id_1, COUNT(DISTINCT id_2) AS Nb FROM ( SELECT id_1, id_2 FROM your_table_name WHERE SUBSTRING(Date, 5, 2) IN ('12', '01') -- 筛选12月和1月的数据 GROUP BY id_1, id_2 HAVING COUNT(DISTINCT SUBSTRING(Date, 5, 2)) = 2 -- 保留同时出现在两个月份的(id_1,id_2)对 ) AS filtered_pairs GROUP BY id_1;
代码逻辑解释
- 筛选目标月份数据:通过
SUBSTRING(Date,5,2)提取日期中的月份部分,只保留12月('12')和1月('01')的记录。 - 验证跨月存在性:按
id_1和id_2分组,统计每个组内不同月份的数量。若数量为2,说明该id_2同时在两个月份与id_1关联。 - 统计最终结果:对过滤后的有效
(id_1,id_2)对,按id_1分组并统计不同id_2的数量,得到最终结果。
优化说明
- 避免了多次Merge操作:全程仅通过嵌套分组完成,无需对不同月份的数据做Join或Merge。
- 自动去重:内层分组去除了同一月份内
(id_1,id_2)的重复记录,避免重复统计。
内容的提问来源于stack exchange,提问作者GRX
相关产品推荐
相关产品推荐

