如何实现两个DataFrame的笛卡尔积合并并生成分类列
解决DataFrame笛卡尔积合并及分类列添加问题
方法1:通过临时列实现笛卡尔积
要生成两个DataFrame的笛卡尔积,核心是给两表添加相同的临时关联列,再做全连接:
- 给df1和df2都新增一个值统一的临时列(比如
key=1) - 基于临时列执行
pd.merge外连接,得到笛卡尔积结果 - 对比日期列与Max Date,生成Classification列
- 移除临时列
代码示例
import pandas as pd # 示例数据 df1 = pd.DataFrame({ 'Stock': ['AAPL', 'MSFT', 'GOOG'], 'Max Date': pd.to_datetime(['2023-06-30', '2023-07-15', '2023-08-01']), 'Other Col': ['x', 'y', 'z'] }) df2 = pd.DataFrame({ 'Date': pd.to_datetime(['2023-06-15', '2023-07-20', '2023-08-05']) }) # 添加临时关联列 df1['key'] = 1 df2['key'] = 1 # 生成笛卡尔积 merged_df = pd.merge(df1, df2, on='key', how='outer') # 生成Classification列 merged_df['Classification'] = merged_df.apply( lambda row: 'Lower' if row['Date'] <= row['Max Date'] else 'Higher', axis=1 ) # 删除临时列 merged_df.drop('key', axis=1, inplace=True) print(merged_df)
方法2:使用cross方法(Pandas 1.2.0+)
Pandas 1.2.0及以上版本提供了cross方法,可直接生成笛卡尔积,无需临时列:
代码示例
# 直接生成笛卡尔积 cross_df = df1.merge(df2, how='cross') # 生成Classification列 cross_df['Classification'] = [ 'Lower' if date <= max_date else 'Higher' for date, max_date in zip(cross_df['Date'], cross_df['Max Date']) ] print(cross_df)
关键注意点
- 确保所有日期列都是
datetime类型,可通过pd.to_datetime()转换,避免比较出错 - 若原DataFrame数据量较大,笛卡尔积会大幅增加结果集大小,需注意内存占用
内容的提问来源于stack exchange,提问作者access_nash
相关产品推荐
相关产品推荐

