You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按日期统计DataFrame中sentiment为1的推文数量(补全缺失日期)

按日期统计sentiment=1推文数量并补全无数据日期为0

问题分析

你当前的代码仅统计了存在sentiment=1推文的日期,缺失无数据日期的0值,且循环筛选数据的方式效率极低。解决核心是生成覆盖全部时间范围的完整日期序列,再将统计结果与该序列合并填充0。

优化解决方案

步骤拆解

  1. 高效筛选目标数据:用布尔索引直接筛选sentiment=1的行,替代低效的循环append
  2. 统一日期格式:将日期列转换为datetime类型并向下取整到天
  3. 生成完整日期序列:基于数据集的最早和最晚日期,创建连续的每日日期序列
  4. 统计并合并填充:统计每日推文数量,与完整日期序列左连接,缺失值填充为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)

原代码问题修正

  1. 删除了低效的循环筛选逻辑,改用布尔索引直接提取目标数据
  2. 新增完整日期序列生成与合并步骤,补全无数据日期的0值
  3. 简化统计逻辑,用groupby.size()替代value_counts(),逻辑更直观清晰

内容的提问来源于stack exchange,提问作者Rashid Abramov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:40:37