如何基于value_counts()创建2012-2017年犯罪数量统计DataFrame
解决年份犯罪次数统计的问题
我来帮你搞定这个需求,先拆解下你现有代码的小问题,再给你两种完善的实现方案:
现有代码的问题点
- 你用
pd.DataFrame(df_1.year.value_counts(), columns=["Year", "AggregateCrime"])的时候,value_counts()返回的是一个索引为年份、值为犯罪次数的Series。直接转DataFrame时,年份会变成行索引,而你指定的["Year", "AggregateCrime"]列会导致Year列全是NaN(因为原Series没有这个字段),这不符合预期。 sort_index(axis = 0, ascending=...)这里需要明确填True,才能让年份按升序(2012→2017)排列。- 另外,原代码可能会漏掉2012-2017中没有犯罪记录的年份,如果你需要这些年份也显示统计值0,就得额外处理。
方案1:基础版(仅统计有犯罪记录的年份)
这个方案适合只需要统计数据中存在的年份,步骤如下:
import pandas as pd # 1. 统计各年份犯罪次数,同时重置索引把年份从索引转为列 crime_year = df_1['Year'].value_counts().reset_index() # 2. 设置正确的列名 crime_year.columns = ['Year', 'AggregateCrime'] # 3. 按年份升序排序 crime_year = crime_year.sort_values(by='Year', ascending=True)
方案2:进阶版(补全2012-2017所有年份)
如果需要确保2012到2017的每一年都出现在结果里(哪怕某一年没有犯罪,显示0次),可以用reindex来补全年份:
import pandas as pd # 1. 统计各年份犯罪次数 year_counts = df_1['Year'].value_counts() # 2. 创建包含2012-2017所有年份的索引对象 all_target_years = pd.Index(range(2012, 2018), name='Year') # 3. 重新索引,缺失年份填充0,再重置索引转为标准DataFrame crime_year = year_counts.reindex(all_target_years, fill_value=0).reset_index() # 4. 设置列名 crime_year.columns = ['Year', 'AggregateCrime']
这样处理后,哪怕2012年没有犯罪记录,结果里也会有一行2012, 0,完美覆盖你要的时间范围。
内容的提问来源于stack exchange,提问作者anandg112
相关产品推荐
相关产品推荐

