使用Python Pandas计算两类警情的平均出警单元数比值
计算两类警情平均出警单元数的比值
核心思路
筛选出目标两类警情的记录,分别计算它们的出警单元数均值,最后求两者的比值。以下是针对大数据集的高效实现方案:
代码实现
1. 基础导入与数据读取
import pandas as pd # 读取CSV文件,大文件添加low_memory=False避免类型推断警告 df = pd.read_csv('your_dataset.csv', low_memory=False)
2. 方法一:布尔索引(直观易读)
# 筛选两类警情并计算均值 mean_fire = df[df['警情类型(Types of Incidents)'] == '111 - Building fire']['出警单元数(Number of units)'].mean() mean_smoke = df[df['警情类型(Types of Incidents)'] == '651 - Smoke scare, odor of smoke']['出警单元数(Number of units)'].mean() # 计算比值 ratio = mean_fire / mean_smoke print(f"比值结果: {ratio:.2f}")
3. 方法二:GroupBy分组(适合多警情分析场景)
如果后续需要分析更多警情类型,分组计算会更高效:
# 按警情类型分组,批量计算均值 incident_avg = df.groupby('警情类型(Types of Incidents)')['出警单元数(Number of units)'].mean() # 提取目标警情的均值并计算比值 ratio = incident_avg['111 - Building fire'] / incident_avg['651 - Smoke scare, odor of smoke'] print(f"比值结果: {ratio:.2f}")
4. 大数据集优化:query方法(内存友好)
针对超大规模数据集,query()能减少中间内存占用:
# 注意列名含特殊字符,需用反引号包裹 mean_fire = df.query('`警情类型(Types of Incidents)` == "111 - Building fire"')['出警单元数(Number of units)'].mean() mean_smoke = df.query('`警情类型(Types of Incidents)` == "651 - Smoke scare, odor of smoke"')['出警单元数(Number of units)'].mean() ratio = mean_fire / mean_smoke print(f"比值结果: {ratio:.2f}")
关键注意事项
- 列名匹配:务必确认数据中的列名与代码完全一致(包括空格、中英文符号),可通过
print(df.columns)查看列名列表。 - 空值处理:如果
出警单元数列存在空值,mean()默认会自动跳过;若需过滤空值后计算,可先执行df = df.dropna(subset=['出警单元数(Number of units)'])。 - 字符串匹配:检查警情类型字符串是否完全匹配(比如有无多余空格、大小写差异),可通过
df['警情类型(Types of Incidents)'].unique()查看所有唯一值。
内容的提问来源于stack exchange,提问作者user31081998
相关产品推荐
相关产品推荐

