如何创建并按ID合并多城市DataFrame,重命名VOLUME列?
解决方案:按ID合并多城市数据并重命名VOLUME列
搞定这个需求很简单!你现在用concat是把所有数据行纵向堆叠,但其实需要按ID做横向合并,同时给每个城市的VOLUME列加上专属后缀来区分。下面是修改后的完整代码,还有详细说明:
修改后的代码(两种实现方式)
方式1:用functools.reduce一次性合并(简洁高效)
import pandas as pd from functools import reduce data_dir_file = 'Data' cities = ['NY','Chicago','Boston','Toronto'] dfs = [] for city in cities: file_name = f'Data_2010_{city}.csv' df = pd.read_csv(f'{data_dir_file}\\{file_name}', sep=';') df = df[['ID','VOLUME']].drop_duplicates() # 核心:给当前城市的VOLUME列加上城市后缀 df = df.rename(columns={'VOLUME': f'VOLUME_{city}'}) dfs.append(df) # 用reduce把所有DataFrame按ID做outer合并 df_merged = reduce(lambda left, right: pd.merge(left, right, on='ID', how='outer'), dfs) print(df_merged)
方式2:逐步循环合并(更直观,适合理解过程)
如果你觉得reduce有点抽象,可以用更直白的循环方式:
import pandas as pd data_dir_file = 'Data' cities = ['NY','Chicago','Boston','Toronto'] dfs = [] for city in cities: file_name = f'Data_2010_{city}.csv' df = pd.read_csv(f'{data_dir_file}\\{file_name}', sep=';') df = df[['ID','VOLUME']].drop_duplicates() df = df.rename(columns={'VOLUME': f'VOLUME_{city}'}) dfs.append(df) # 初始化合并结果为第一个城市的数据 df_merged = dfs[0] # 依次合并剩下的城市数据 for df in dfs[1:]: df_merged = pd.merge(df_merged, df, on='ID', how='outer') print(df_merged)
关键细节说明
- 列重命名:
rename(columns={'VOLUME': f'VOLUME_{city}'})这一步是核心,确保每个城市的销量列有唯一标识,避免合并后列名冲突。 - 合并方式:
how='outer'会保留所有出现过的ID——如果某个ID在某个城市没有数据,对应的VOLUME_xxx列会显示NaN。如果只需要保留在所有城市都存在的ID,把how='outer'改成how='inner'即可。 - 去重处理:你原来的
drop_duplicates()很关键,确保每个ID在单个城市的DataFrame里只有一条记录,避免合并后出现重复行。
内容的提问来源于stack exchange,提问作者diversis
相关产品推荐
相关产品推荐

