如何从双边净出口DataFrame生成各国总净贸易DataFrame?
计算各国总净贸易额的实现步骤
现有包含From(出口国)、To(进口国)、Net exports(净出口额)三列的pandas DataFrame df,数据如下:
{'From': {0: 'A', 1: 'A', 2: 'B', 3: 'C', 4: 'D'}, 'To': {0: 'B', 1: 'C', 2: 'C', 3: 'D', 4: 'A'}, 'Net exports': {0: 3, 1: 6, 2: 2, 3: 2, 4: 5}}
需求是生成新DataFrame df2,展示各国总净贸易额:国家出现在From列时对应净出口额做加法,出现在To列时做减法(例如A国总净贸易额为3+6-5=4)。已知可通过all_countries = list(set(df["From"]).union(set(df["To"])))获取所有国家列表,以下是具体实现步骤:
方法一:基于已获取的国家列表遍历计算
这种方法逻辑直观,适合理解基础原理:
- 初始化空字典存储每个国家的总净贸易额
- 遍历每个国家,分别计算其作为出口国的总金额、作为进口国的总金额
- 用出口总额减去进口总额得到总净贸易额,存入字典
- 将字典转换为目标DataFrame
df2
代码实现:
import pandas as pd # 假设已获取all_countries列表 all_countries = list(set(df["From"]).union(set(df["To"]))) # 初始化结果字典 total_net_trade = {} for country in all_countries: # 计算该国家的总出口额 total_export = df.loc[df["From"] == country, "Net exports"].sum() # 计算该国家的总进口额 total_import = df.loc[df["To"] == country, "Net exports"].sum() # 计算总净贸易额 total_net_trade[country] = total_export - total_import # 转换为DataFrame并整理格式 df2 = pd.DataFrame( total_net_trade.items(), columns=["Country", "Total Net Trade"] ).sort_values("Country").reset_index(drop=True)
方法二:Pandas向量化分组聚合(更高效)
这种方法无需手动遍历,利用Pandas内置的分组功能,适合处理大数据量:
- 分别对
From列、To列分组,计算各国的出口总额和进口总额 - 合并两组结果,缺失值填充为0(代表无对应出口/进口记录)
- 计算总净贸易额并整理成目标DataFrame
代码实现:
import pandas as pd # 计算各国出口总额 export_totals = df.groupby("From")["Net exports"].sum().rename("Total Exports") # 计算各国进口总额 import_totals = df.groupby("To")["Net exports"].sum().rename("Total Imports") # 合并数据并填充缺失值 combined_data = export_totals.to_frame().join(import_totals, how="outer").fillna(0) # 计算总净贸易额 combined_data["Total Net Trade"] = combined_data["Total Exports"] - combined_data["Total Imports"] # 转换为目标DataFrame df2 df2 = combined_data.reset_index().rename(columns={"index": "Country"})
两种方法最终得到的df2结果一致,示例输出如下:
| Country | Total Net Trade |
|---|---|
| A | 4 |
| B | -1 |
| C | -6 |
| D | 3 |
内容的提问来源于stack exchange,提问作者hbstha123
相关产品推荐
相关产品推荐

