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

如何利用另一DataFrame高效更新DataFrame中的数组字段

高效实现DataFrame数组列的匹配拼接

针对你的需求,完全可以通过pandas的向量化操作实现,避免循环带来的性能问题,具体步骤如下:

1. 模拟示例数据

先构造两个符合你描述的DataFrame,方便理解操作逻辑:

import pandas as pd

# 第一个DataFrame:ID为索引,colB是数组类型
df1 = pd.DataFrame(
    {'colB': [[1, 2], [3], []]},
    index=['ID1', 'ID2', 'ID3']
)

# 第二个DataFrame:包含ID、ColA、数值类型colD
df2 = pd.DataFrame({
    'ID': ['ID1', 'ID1', 'ID2', 'ID4'],
    'ColA': ['a', 'b', 'c', 'd'],
    'colD': [4, 5, 6, 7]
})

2. 高效处理流程

步骤1:对第二个DataFrame按ID分组汇总colD

将df2中同一ID对应的所有colD值合并成列表,这一步是向量化操作,性能远高于循环:

# 按ID分组,把每个ID的colD转为列表
df2_grouped = df2.groupby('ID')['colD'].agg(list).reset_index()

步骤2:合并两个DataFrame

把df1的索引转为ID列,再和分组后的df2做左连接,确保保留df1的所有行:

# 重置df1的索引为ID列
df1_reset = df1.reset_index().rename(columns={'index': 'ID'})
# 左连接合并,匹配ID对应的colD列表
merged = df1_reset.merge(df2_grouped, on='ID', how='left')

步骤3:拼接数组列并清理结果

处理未匹配到ID的空值,然后把原colB数组和新的colD列表拼接,最后恢复索引:

# 将NaN转为空列表,避免拼接报错
merged['colD'] = merged['colD'].apply(lambda x: x if isinstance(x, list) else [])
# 拼接colB和colD的数组
merged['colB'] = merged['colB'] + merged['colD']
# 恢复ID为索引,删除临时列
result = merged.set_index('ID').drop(columns='colD')

3. 性能说明

整个流程全部使用pandas底层优化的向量化操作,没有显式循环,处理5万行数据完全可以快速完成,避免了循环遍历的O(n)时间复杂度瓶颈。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:05:04