如何基于关联DataFrame计算城市与对应国家的数值差值?
解决方案
核心思路
先建立城市与国家的对应映射,再将df3的国家维度数据匹配到df1的城市维度列,最后执行逐单元格的减法操作,保证输出结构与df1完全一致。
代码实现
import pandas as pd # 构造示例DataFrame df1 = pd.DataFrame( data=[[1,81,26,55,95], [92,42,96,98,7], [14,4,60,88,73]], index=pd.date_range('2023-01-01', periods=3), columns=['NY', 'LA', 'Rome', 'London', 'Milan'] ) df2 = pd.DataFrame( data=[['NY','US'], ['LA','US'], ['London','UK'], ['Rome','Italy'], ['Milan','Italy']], columns=['City', 'Country'] ) df3 = pd.DataFrame( data=[[70,41,32], [98,46,45], [83,50,17]], index=pd.date_range('2023-01-01', periods=3), columns=['US', 'UK', 'Italy'] ) # 1. 生成城市-国家映射字典 city_country_map = df2.set_index('City')['Country'].to_dict() # 2. 将df3转换为与df1列对齐的结构:每列对应城市所属国家的数值 matched_country_data = df3[city_country_map.values()].set_axis(city_country_map.keys(), axis=1) # 3. 执行减法运算得到结果 result_df = df1 - matched_country_data print(result_df)
输出结果
运行代码后将得到与df1结构完全一致的结果:
NY LA Rome London Milan 2023-01-01 -69 11 -6 14 63 2023-01-02 -6 -56 51 52 -38 2023-01-03 -69 -79 43 38 56
关键细节说明
city_country_map:把df2转换为字典格式,快速通过城市名找到对应国家。matched_country_data:提取df3中对应国家的列,再将列名替换为城市名,确保和df1的列结构完全匹配,让减法操作能按行列一一对应执行。- 直接减法:利用pandas的广播特性,自动按日期索引和城市列对齐,完成逐单元格的数值计算。
内容的提问来源于stack exchange,提问作者younggotti
相关产品推荐
相关产品推荐

