基于城市映射字典合并Pandas行列并求和(机场转城市航班数)
如何用Pandas将机场航班数据合并为城市级汇总(行/列合并求和)
哈哈,这个需求太常见了——从机场粒度汇总到城市粒度,用Pandas完全可以轻松搞定!核心就是靠你手里的那个城市-机场字典,把每个机场映射到对应的城市,然后分组求和就行。我给你一步步讲明白:
步骤1:先把城市-机场字典反转成「机场→城市」的映射
你手里的字典是城市为键、对应机场列表为值,我们需要先把它转成每个机场对应所属城市的字典,这样才能快速给DataFrame的行和列做映射。比如:
# 假设你的城市-机场字典长这样 city_airports = { "北京": ["PEK", "NAY"], "上海": ["PVG", "SHA"], "广州": ["CAN"], "深圳": ["SZX"] } # 反转成机场到城市的映射 airport_to_city = {airport: city for city, airports in city_airports.items()}
步骤2:合并行(按出发城市分组求和)
假设你的DataFrame行索引是出发机场代码,我们先把索引替换成对应的城市,然后按城市分组求和,这样同属一个城市的所有出发机场的航班数就会被合并:
# 把行索引映射为城市 df.index = df.index.map(airport_to_city) # 按行的城市分组,对所有列求和 df = df.groupby(level=0).sum()
步骤3:合并列(按到达城市分组求和)
同理,DataFrame的列是到达机场代码,用同样的逻辑处理列,就能合并同一城市的到达机场数据:
# 把列名映射为城市 df.columns = df.columns.map(airport_to_city) # 按列的城市分组,对所有行求和 df = df.groupby(axis=1, level=0).sum()
完整示例演示
给你一个可直接运行的完整例子,方便你对照:
import pandas as pd # 1. 定义城市-机场映射字典 city_airports = { "北京": ["PEK", "NAY"], "上海": ["PVG", "SHA"], "广州": ["CAN"] } airport_to_city = {airport: city for city, airports in city_airports.items()} # 2. 创建示例航班交叉表(行=出发机场,列=到达机场,值=航班数量) flight_data = { "PEK": [0, 12, 8], "NAY": [0, 5, 3], "PVG": [15, 0, 10], "SHA": [7, 0, 4], "CAN": [9, 11, 0] } df = pd.DataFrame(flight_data, index=["PEK", "NAY", "PVG", "SHA", "CAN"]) # 3. 合并行(出发城市) df.index = df.index.map(airport_to_city) df = df.groupby(level=0).sum() # 4. 合并列(到达城市) df.columns = df.columns.map(airport_to_city) df = df.groupby(axis=1, level=0).sum() # 查看结果 print(df)
运行后得到的结果就是城市之间的航班总数量啦!
小提示:处理未匹配的机场
如果你的DataFrame里有不在字典中的机场,可以用get()方法设置默认值,避免报错:
# 把未匹配的机场归为"其他"类别 df.index = df.index.map(lambda x: airport_to_city.get(x, "其他"))
内容的提问来源于stack exchange,提问作者Lorcán
相关产品推荐
相关产品推荐

