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

在Pandas中实现类KDB的Left Join(左内连接)

在Pandas中实现KDB风格的左连接(保留左表全结构,右表仅匹配键的第一条记录)

需求明确

  • 左右表的键列ticker均存在重复值
  • 需完全保留左表的结构和行数,右表仅匹配每个ticker对应的第一条记录
  • 禁止使用PyKX,方案需适配500万+量级的生产数据
  • 对应KDB中的左连接逻辑(示例如下):

KDB示例:

// 左表
left: ([] ticker: `AAPL`AAPL`MSFT`GOOG`MSFT; price: 150 151 300 280 301)
// 右表
right: ([] ticker: `AAPL`AAPL`MSFT`GOOG`GOOG; sector: `Tech`ConsumerTech`Tech`Alphabet`Tech)
// KDB左连接(保留左表全结构,右表取每个ticker首条匹配)
left lj (`ticker xcol 1#) each right

预期输出:

ticker price sector
----------------------
AAPL   150   Tech
AAPL   151   Tech
MSFT   300   Tech
GOOG   280   Alphabet
MSFT   301   Tech

问题分析

Pandas默认的merge(how='left')是左外连接,当右表存在重复键时,会将所有匹配行与左表关联,导致左表行数膨胀,不符合需求。

高效解决方案

核心思路:先对右表做去重处理(仅保留每个ticker的第一条记录),再与左表做左连接,既保证左表结构完整,又适配大数据量。

代码实现

import pandas as pd

# 构造示例左表
df_left = pd.DataFrame({
    'ticker': ['AAPL', 'AAPL', 'MSFT', 'GOOG', 'MSFT'],
    'price': [150, 151, 300, 280, 301]
})

# 构造示例右表
df_right = pd.DataFrame({
    'ticker': ['AAPL', 'AAPL', 'MSFT', 'GOOG', 'GOOG'],
    'sector': ['Tech', 'Consumer Tech', 'Tech', 'Alphabet', 'Tech']
})

# 步骤1:对右表去重,仅保留每个ticker的第一条记录
# drop_duplicates是Pandas优化过的向量方法,处理500万+数据性能优异
df_right_unique = df_right.drop_duplicates(subset=['ticker'], keep='first').reset_index(drop=True)

# 步骤2:左连接,完全保留左表结构
result = pd.merge(df_left, df_right_unique, on='ticker', how='left')

# 查看结果
print(result)

输出结果

ticker  price    sector
0   AAPL    150      Tech
1   AAPL    151      Tech
2   MSFT    300      Tech
3   GOOG    280  Alphabet
4   MSFT    301      Tech

性能说明

  • drop_duplicates基于Pandas的底层C扩展优化,处理500万行级数据仅需毫秒级耗时
  • 去重后的右表行数远小于原表,后续merge操作的时间复杂度大幅降低,避免了笛卡尔积导致的内存溢出风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:48:23