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

基于条件合并两个DataFrame并计算每10万人口犯罪率

解决步骤:合并DataFrame并计算每10万人口犯罪率

先别着急,我们一步步拆解你的需求——从整理现有数据,到合并两个透视表,再到计算目标犯罪率,全程给你捋清楚:

1. 先把现有数据结构化(模拟透视表格式)

你给出的县域犯罪数我先整理成宽格式的透视表(也就是你提到的第一个透视表),同时我会模拟一份对应各区县年度人口的透视表(第二个透视表,毕竟计算犯罪率离不开人口数据):

import pandas as pd

# 犯罪数透视表(宽格式:行=县名,列=年份)
crime_data = {
    'CountyName': ['Alameda', 'Alpine', 'Amador', 'Butte', 'Calaveras', 'Colusa', 'Contra Costa', 'Del Norte'],
    2010: [12115, 355, 2572, 5966, 3236, 1219, 966, 1923],
    2011: [11971, 481, 3033, 5988, 4606, 1325, 1032, 2388],
    2012: [13412, 200, 2525, 5459, 4586, 1322, 1100, 2229],
    2013: [12327, 174, 2390, 5533, 4162, 1406, 857, None],
    2014: [10944, 125, 2087, 5085, 4055, 817, 759, None],
    2015: [10463, 202, 1856, 6542, 3276, 763, 775, None],
    2016: [11410, 165, 2064, 6324, 3012, 850, 7553, None]
}
crime_df = pd.DataFrame(crime_data).set_index('CountyName')

# 模拟人口数据透视表(宽格式:行=县名,列=年份)
population_data = {
    'CountyName': ['Alameda', 'Alpine', 'Amador', 'Butte', 'Calaveras', 'Colusa', 'Contra Costa', 'Del Norte'],
    2010: [1510271, 1175, 38091, 220000, 45578, 21419, 1049025, 28610],
    2011: [1525858, 1159, 38381, 221500, 45790, 21590, 1060000, 28750],
    2012: [1542298, 1143, 38640, 223000, 45980, 21750, 1071000, 28890],
    2013: [1559314, 1127, 38870, 224500, 46150, 21900, 1082000, 29030],
    2014: [1577132, 1111, 39080, 226000, 46300, 22040, 1093000, 29170],
    2015: [1595782, 1095, 39270, 227500, 46440, 22170, 1104000, 29310],
    2016: [1615485, 1079, 39440, 229000, 46570, 22290, 1115000, 29450]
}
population_df = pd.DataFrame(population_data).set_index('CountyName')

2. 把透视表转成长格式(方便合并)

宽格式的透视表没法直接按「县+年份」匹配数据,我们得先把它们转成长格式——每一行对应一个县的某一年度数据:

# 犯罪数据转长格式
crime_long = crime_df.stack().reset_index()
crime_long.columns = ['CountyName', 'Year', 'TotalCrimes']

# 人口数据转长格式
population_long = population_df.stack().reset_index()
population_long.columns = ['CountyName', 'Year', 'Population']

3. 合并两个DataFrame

现在用CountyName和Year作为匹配键,把两个长格式数据合并到一起。如果你的数据里有缺失值,可以把how='inner'改成how='left',保留所有犯罪数据:

merged_df = pd.merge(crime_long, population_long, on=['CountyName', 'Year'], how='inner')

4. 计算每10万人口犯罪率

这一步就是核心计算了:犯罪率 = (年度犯罪总数 / 年度人口数) * 100000,我们新增一列存储结果,顺便保留两位小数更直观:

merged_df['CrimeRatePer100k'] = round((merged_df['TotalCrimes'] / merged_df['Population']) * 100000, 2)

可选:转回透视表格式

如果你之后还需要透视表样式的结果,直接把合并后的数据再转回去就行:

crime_rate_pivot = merged_df.pivot(index='CountyName', columns='Year', values='CrimeRatePer100k')

举个例子,Alameda县2010年的犯罪率大概是802.17,你可以在merged_df或者crime_rate_pivot里看到所有区县的年度犯罪率结果。


内容的提问来源于stack exchange,提问作者Glenn G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:18:36