如何在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))
合并后的结果片段示例:
| City | Week | qty_from_df1 | Year | qty_from_df2 |
|---|---|---|---|---|
| hyd | 35 | 10 | 2015 | NaN |
| hyd | 36 | 15 | 2015 | NaN |
| hyd | 37 | 11 | 2015 | NaN |
| hyd | 42 | 10 | 2015 | NaN |
| hyd | 23 | 10 | 2016 | NaN |
方法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
相关产品推荐
相关产品推荐

