如何按日期统计DataFrame中sentiment为1的推文数量(补全缺失日期)
按日期统计sentiment=1推文数量并补全无数据日期为0
问题分析
你当前的代码仅统计了存在sentiment=1推文的日期,缺失无数据日期的0值,且循环筛选数据的方式效率极低。解决核心是生成覆盖全部时间范围的完整日期序列,再将统计结果与该序列合并填充0。
优化解决方案
步骤拆解
- 高效筛选目标数据:用布尔索引直接筛选sentiment=1的行,替代低效的循环append
- 统一日期格式:将日期列转换为datetime类型并向下取整到天
- 生成完整日期序列:基于数据集的最早和最晚日期,创建连续的每日日期序列
- 统计并合并填充:统计每日推文数量,与完整日期序列左连接,缺失值填充为0
完整代码
import pandas as pd # 1. 筛选sentiment=1的数据并处理日期 df_xenophobic = df_unevaluated[df_unevaluated['sentiment'] == 1].copy() df_xenophobic['date'] = pd.to_datetime(df_xenophobic['date']).dt.floor('d') # 2. 统计每日计数 daily_counts = df_xenophobic.groupby('date').size().rename('count').reset_index() # 3. 生成完整日期序列(覆盖所有需统计的日期) if not daily_counts.empty: min_date = daily_counts['date'].min() max_date = daily_counts['date'].max() else: # 若无sentiment=1数据,基于原数据集日期范围生成 min_date = pd.to_datetime(df_unevaluated['date']).min().floor('d') max_date = pd.to_datetime(df_unevaluated['date']).max().floor('d') full_date_range = pd.date_range(start=min_date, end=max_date, freq='D', tz='UTC') # 4. 合并并填充0值 df_counts = pd.DataFrame({'date': full_date_range}) df_counts = df_counts.merge(daily_counts, on='date', how='left').fillna({'count': 0}) df_counts['count'] = df_counts['count'].astype(int) # 查看结果 df_counts.head()
代码说明
- 布尔索引筛选:
df_unevaluated[df_unevaluated['sentiment'] == 1]比循环append效率高几个数量级,尤其适用于大型数据集 - 日期序列生成:
pd.date_range生成连续的每日日期,确保覆盖所有需要统计的时间点 - 左连接填充:用左连接将统计结果与完整日期序列合并,
fillna(0)自动将无数据日期的计数设为0 - 时区对齐:指定
tz='UTC'保证输出日期格式与原数据一致(YYYY-MM-DD HH:MM:SS+00:00)
原代码问题修正
- 删除了低效的循环筛选逻辑,改用布尔索引直接提取目标数据
- 新增完整日期序列生成与合并步骤,补全无数据日期的0值
- 简化统计逻辑,用
groupby.size()替代value_counts(),逻辑更直观清晰
内容的提问来源于stack exchange,提问作者Rashid Abramov
相关产品推荐
相关产品推荐

