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

Python中构建用于回归分析的时序DataFrame方法

问题描述

我拥有一份犯罪数据集,每一行对应一起已记录的犯罪案件,包含Date、Crime Type、District三列。需要将其转换为适合回归分析的时序DataFrame:

  • 目标结构:每行对应单个区域的某一天,列包含Date、District,以及每种犯罪类型的专属列(如Murder、Theft),列值为该区域当天发生的对应犯罪数量
  • 最终数据集行数 = 区域总数 × 目标日期范围内的天数

我已通过以下代码生成目标日期范围:

datelist = pd.date_range(start='01-01-2011', end='12-31-2015', freq='1d')

想寻求无需循环DataFrame的实现方法,完成原始数据与日期列表的合并并生成所需结构。

无循环实现方案

利用pandas的分组聚合、笛卡尔积生成和数据透视功能,可全程避免循环:

1. 统计每日各区域的犯罪类型数量

先对原始数据集按日期、区域、犯罪类型分组,统计每组的案件数量:

# 假设原始数据集变量名为 df_crime
daily_counts = df_crime.groupby(['Date', 'District', 'Crime Type']).size().reset_index(name='CaseCount')

2. 生成全量日期-区域组合

将目标日期列表与所有唯一区域做笛卡尔积,得到所有需要的行(每个区域的每一天):

# 获取数据集内的所有唯一区域
unique_districts = df_crime['District'].unique()
# 生成日期与区域的笛卡尔积
full_date_district = pd.MultiIndex.from_product(
    [datelist, unique_districts],
    names=['Date', 'District']
).to_frame(index=False)

3. 透视数据并合并填充

将统计得到的犯罪数据透视,把Crime Type转为列,再与全量日期-区域数据左连接,最后用0填充缺失值(代表当天该区域无对应类型犯罪):

# 透视犯罪数据:犯罪类型转为列,值为案件数
pivoted_data = daily_counts.pivot(
    index=['Date', 'District'],
    columns='Crime Type',
    values='CaseCount'
).reset_index()

# 合并到全量数据集并填充缺失值
final_df = full_date_district.merge(pivoted_data, on=['Date', 'District'], how='left').fillna(0)

# 移除列名的层级标签(可选,让列名更简洁)
final_df.columns.name = None

最终得到的final_df完全符合需求:每行对应一个区域的单日记录,每种犯罪类型作为独立列,数值为当天的犯罪数量。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:45:40