Python:按日期统计DataFrame中id列的重复条目数量
嘿,我来帮你搞定这个按日期统计每个id重复次数的问题!
首先,咱们先明确需求:要对DataFrame按日期分组,然后统计每个id在对应日期里的出现次数——就像你说的,每个日期里id=1都出现两次,而id=2可能只出现一次对吧?
问题分析
你之前的代码之所以会让id=2的结果全是1,大概率是分组逻辑不对:比如你可能只按日期单字段分组,然后用了count()或者nunique()这类不匹配的统计方法。count()会统计当天所有非空记录数,nunique()是统计当天有多少个不同的id,都不是咱们要的“每个id在当天的重复次数”。
正确解决方案
我给你两种常用的实现方式,按需选就行:
方式1:生成单独的统计结果表
先按日期+id双字段分组,计算每组的大小,就能直接得到每个日期每个id的重复次数:
import pandas as pd # 先模拟你的DataFrame(可以替换成你实际的df) df = pd.DataFrame({ '日期': ['2024-01-01', '2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02'], 'id': [1, 1, 2, 1, 1] }) # 核心代码:分组统计 result = df.groupby(['日期', 'id']).size().reset_index(name='重复次数')
运行后得到的result就是:
| 日期 | id | 重复次数 |
|---|---|---|
| 2024-01-01 | 1 | 2 |
| 2024-01-01 | 2 | 1 |
| 2024-01-02 | 1 | 2 |
如果想要把id作为列展示(更贴近常见的报表格式),可以用unstack调整结构:
result_pivot = result.set_index(['日期', 'id'])['重复次数'].unstack(fill_value=0)
这样结果会变成:
| 日期 | 1 | 2 |
|---|---|---|
| 2024-01-01 | 2 | 1 |
| 2024-01-02 | 2 | 0 |
方式2:在原DataFrame中添加统计列
如果想在原数据的每一行直接显示对应日期+id的重复次数,用transform方法更方便:
df['当日重复次数'] = df.groupby(['日期', 'id'])['id'].transform('size')
处理后的原df会变成:
| 日期 | id | 当日重复次数 |
|---|---|---|
| 2024-01-01 | 1 | 2 |
| 2024-01-01 | 1 | 2 |
| 2024-01-01 | 2 | 1 |
| 2024-01-02 | 1 | 2 |
| 2024-01-02 | 1 | 2 |
这样不管是id=1还是id=2,都能正确显示它们在对应日期的重复次数啦!
内容的提问来源于stack exchange,提问作者freddy888




