You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建并按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 17:15:50