我将尝试在这里回答我自己的问题。我想我想通了,但如果对我的方法有任何意见,我将不胜感激。我能够在不循环的情况下做到这一点,而是使用 pivot_table 和合并。
导入包:
import pandas as pd
from datetime import datetime
import numpy as np
导入犯罪数据集:
crime_df = pd.read_csv("/Users/howard/Crime_Data.csv")
创建范围内的日期列表:
datelist = pd.date_range(start='01-01-2011', end='12-31-2015', freq='1d')
为此日期列表的长度和唯一地区列表的长度创建变量:
nd = len(datelist)
nu = len(df_crime['District'].unique())
创建结合日期和地区的数据框:
date_df = pd.DataFrame({'District':df_crime['District'].unique().tolist()*nd, 'Date':np.repeat(datelist,nu)})
现在我们转向我们的犯罪数据集。
我添加了一列 1,以便在下一步中求和:
crime_df["ones"] = 1
接下来,我们获取我们的犯罪数据并使用 Pandas pivot_table 将其以广泛的形式呈现:
crime_df = pd.pivot_table(crime_df,index=["District","Date"], columns="Crime Type", aggfunc="sum")
这给了我堆叠级别的列和一个不必要的索引,所以我用以下内容删除了它们:
crime_df.columns.droplevel()
crime_df.reset_index(inplace=True)
最后一步是合并两个数据集。我想将 date_df 放在首位并合并,因为它包括范围内的所有日期以及每个日期包含的所有地区。因此,这使用了左合并。
final_df = pd.merge(date_df, crime_df, on=["Date", "District"],how="left")
现在我可以用 0 填充 NaN 来完成
final_df.fillna(0, inplace=True)
我们的最终数据框采用正确的形式进行时间序列分析 - 回归、绘图等。如果日期列是索引,我使用的 matplotlib.pyplot 中的许多图更容易制作。这可以这样做:
df_final = df_final.set_index(['Date'])
而已!希望这对其他人有所帮助,并请评论任何改进的方法。