基于条件合并两个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.
相关产品推荐
相关产品推荐

