Pandas按ID分组统计日期频次及总天数问题求助
解决方案:按ID分组统计总天数与日期频次
首先,我们需要先处理日期格式,提取出Date_Time中的日期部分(去掉时分秒),这样才能准确统计日期的出现频次,而不是完整时间戳的频次。接下来分三步完成需求:
1. 数据预处理:提取日期列
先把Date_Time转换为datetime类型,然后提取纯日期部分:
import pandas as pd # 示例数据 data = pd.DataFrame({ 'ID': [1, 1, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6], 'Date_Time': ['2010-01-01 12:01:00', '2010-01-01 01:27:33', '2010-04-02 12:01:00', '2010-04-01 07:24:00', '2011-01-01 12:01:00', '2011-01-01 01:27:33', '2013-01-01 12:01:00', '2014-01-01 12:01:00', '2014-01-01 01:27:33', '2015-01-01 01:27:33', '2016-01-01 01:27:33', '2011-01-01 01:28:00'] }) # 提取纯日期列 data['Date'] = pd.to_datetime(data['Date_Time']).dt.date
2. 统计两个核心指标
每个ID的总天数:这里指该ID下出现的不同日期的数量,用
nunique()统计去重后的日期数:# 统计ID对应的总天数 id_total_days = data.groupby('ID')['Date'].nunique().reset_index(name='Total_Days')每个ID下各日期的出现频次:按
ID和Date分组统计数量,再用unstack()把日期转为列,缺失值填充为0:# 统计各日期的出现频次 id_date_counts = data.groupby(['ID', 'Date']).size().unstack(fill_value=0)
3. 合并结果
把两个统计结果按ID合并,得到最终的DataFrame:
# 合并总天数与日期频次 final_result = id_total_days.merge(id_date_counts, on='ID', how='left')
运行后final_result的样式如下(示例):
| ID | Total_Days | 2010-01-01 | 2010-04-01 | 2010-04-02 | 2011-01-01 | 2013-01-01 | 2014-01-01 | 2015-01-01 | 2016-01-01 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 3 | 2 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
| 2 | 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 |
| 3 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
| 4 | 1 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 |
| 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| 6 | 2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
为什么你的原代码无法合并?
你之前的代码number = data.groupby(by=['ID, Date_Time']).size().unstack(fill_value=0)有两个问题:
- 分组列语法错误:
['ID, Date_Time']是一个包含单个字符串的列表,应该写成['ID', 'Date_Time']才是按两列分组; - 统计维度不对:你按完整的时间戳(
Date_Time)分组,每个时间戳几乎都是唯一的,导致unstack()后会生成大量列,且和原数据的结构不匹配,自然无法合并。我们提取日期部分后,统计维度是日期而非时间戳,结果结构更规整,也能顺利和总天数统计结果合并。
内容的提问来源于stack exchange,提问作者Dave Will
相关产品推荐
相关产品推荐

