如何将指定年份集合追加匹配到dataframe的每一条原有记录中
DataFrame多列与指定列表生成笛卡尔积实现方案
核心需求是将原有DataFrame的每一行与年份列表的所有元素做匹配,生成二者的笛卡尔积,以下是两种最简实现方式:
前置准备
首先构造你的原始数据和待匹配的年份列表:
import pandas as pd # 原始DataFrame(可直接替换为你自己的df) df = pd.DataFrame([ ['val1', 'val2'], ['val1', 'val3'], ['val2', 'val1'], ['val2', 'val3'] ], columns=['col1', 'col2']) # 待追加的年份集合 year_list = [1990, 1991, 1992]
方法1:assign + explode(推荐,Pandas 0.25+ 版本适用)
代码最简洁,无论原始DataFrame有多少列都可以直接复用:
result = df.assign(year=year_list).explode('year', ignore_index=True)
实现逻辑:先给每一行新增值为完整年份列表的year字段,再将列表类型的year字段拆分为多行,每一个列表元素对应一条独立记录。
方法2:临时字段笛卡尔积合并(兼容所有Pandas版本)
如果你的Pandas版本低于0.25不支持explode,可以用合并的方式实现:
# 把年份列表转成DataFrame year_df = pd.DataFrame(year_list, columns=['year']) # 给两个表新增相同的临时字段用于全匹配 df['tmp_key'] = 1 year_df['tmp_key'] = 1 # 合并后删除临时字段 result = pd.merge(df, year_df, on='tmp_key').drop('tmp_key', axis=1).reset_index(drop=True)
输出结果
两种方法最终得到的结果均符合需求:
| col1 | col2 | year |
|---|---|---|
| val1 | val2 | 1990 |
| val1 | val2 | 1991 |
| val1 | val2 | 1992 |
| val1 | val3 | 1990 |
| val1 | val3 | 1991 |
| val1 | val3 | 1992 |
| val2 | val1 | 1990 |
| val2 | val1 | 1991 |
| val2 | val1 | 1992 |
| val2 | val3 | 1990 |
| val2 | val3 | 1991 |
| val2 | val3 | 1992 |
内容的提问来源于stack exchange,提问作者chrislee
相关产品推荐
相关产品推荐

