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

如何在Python中合并两个DataFrame?实现多年度周度数据整合查询

合并DataFrame以对比每年同一周的产品数量

看起来你想要把两个DataFrame按**城市(City)、周(Week)、年份(Year)**对齐,方便查看同一周不同年份的产品数量对吧?我给你整理了两种实用的方法,根据你的需求选就行:


方法1:直接合并保留所有记录(适合查看原始数据对齐情况)

这个方法会把两个DataFrame的数量列分别保留,按共同的City、Week、Year键合并,缺失的记录会用NaN填充,确保不会丢数据。

步骤代码:

首先先构造你的两个DataFrame(我补全了df2的缺失部分,你可以根据实际数据调整):

import pandas as pd

# 构造df1
data1 = [
    ["hyd", 35, 10, 2015], ["hyd", 36, 15, 2015], ["hyd", 37, 11, 2015], ["hyd", 42, 10, 2015],
    ["hyd", 23, 10, 2016], ["hyd", 32, 15, 2016], ["hyd", 37, 11, 2017], ["hyd", 42, 10, 2017],
    ["pune", 35, 10, 2015], ["pune", 36, 15, 2015], ["pune", 37, 11, 2015], ["pune", 42, 10, 2015],
    ["pune", 23, 10, 2016], ["pune", 32, 15, 2016], ["pune", 37, 11, 2017], ["pune", 42, 10, 2017]
]
df1 = pd.DataFrame(data1, columns=["City", "Week", "qty", "Year"])

# 构造df2(补全了你提供的缺失部分)
data2 = [
    ["hyd", 23, 10, 2015], ["hyd", 32, 15, 2015], ["hyd", 35, 12, 2016], ["hyd", 36, 15, 2016],
    ["hyd", 37, 13, 2017], ["hyd", 42, 12, 2017], ["pune", 23, 9, 2015], ["pune", 32, 14, 2015],
    ["pune", 35, 11, 2016], ["pune", 36, 16, 2016], ["pune", 37, 12, 2017], ["pune", 42, 11, 2017]
]
df2 = pd.DataFrame(data2, columns=["City", "Week", "qty", "Year"])

然后重命名数量列避免冲突,再合并:

# 重命名qty列,区分来源
df1 = df1.rename(columns={"qty": "qty_from_df1"})
df2 = df2.rename(columns={"qty": "qty_from_df2"})

# 外连接合并,保留所有记录
merged_df = pd.merge(df1, df2, on=["City", "Week", "Year"], how="outer")

# 查看结果(可选)
print(merged_df.head(10))

合并后的结果片段示例:

CityWeekqty_from_df1Yearqty_from_df2
hyd35102015NaN
hyd36152015NaN
hyd37112015NaN
hyd42102015NaN
hyd23102016NaN

方法2:转成宽格式(适合横向对比同一周不同年份的数据)

如果想更直观地看到同一个城市、同一周在所有年份的数量(来自两个DataFrame),可以把数据转成宽格式,让年份作为列:

# 给两个DataFrame添加来源标识
df1["source"] = "df1"
df2["source"] = "df2"

# 合并成一个长格式DataFrame
combined_df = pd.concat([df1, df2], ignore_index=True)

# 转成宽格式:行是City+Week,列是(年份, 来源),值是数量
wide_format_df = combined_df.pivot(
    index=["City", "Week"],
    columns=["Year", "source"],
    values="qty"
).reset_index()

# 查看结果
print(wide_format_df)

这样的结果会把同一城市每周的所有年份数据横向排列,对比起来非常清晰。


小提示:

  • 如果你的两个DataFrame里有完全重复的City-Week-Year组合,合并时可以用how="inner"只保留共同的记录;
  • 如果想填充缺失的NaN值,可以用merged_df.fillna(0)把空值换成0,适合统计场景。

内容的提问来源于stack exchange,提问作者Alok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:30:30