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

如何实现两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:25:55