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

如何将字典值匹配到DataFrame行并添加为关联新列

解决DataFrame根据字典key匹配添加新列的问题

Hey there! Let's fix this problem step by step.

原代码的问题分析

你的嵌套循环写法存在两个核心问题:

  • 每次匹配到k == i时,你直接将整个df['defadd']列赋值为v,这会覆盖之前所有行的值,而不是仅给当前匹配的行赋值。
  • 这种循环方式效率极低,尤其当DataFrame行数较多时,完全没有利用Pandas的向量化操作优势,甚至可能触发索引相关的错误。

高效解决方案:使用map()方法

Pandas的map()方法专门用来处理这种"根据Series值匹配字典key并返回对应value"的需求,它会自动处理没有匹配到key的情况(返回NaN),之后我们可以将NaN替换为空值来符合你的期望输出。

完整代码示例

import pandas as pd

# 初始化DataFrame
data = {'caseno': ['123', '456', '789', '000'], 'defname': ['defendant1', 'defendant2', 'defendant3', 'defendant4']}
df = pd.DataFrame.from_dict(data)

# 定义匹配用的字典
def_dict = {'123': ['123address', '123address2', '123csz'], '456':['456address', '456address2', '456csz']}

# 用map匹配字典,生成新列
df['defadd'] = df['caseno'].map(def_dict)

# 将未匹配到的NaN替换为空字符串(若需要空列表可改为fillna([]))
df['defadd'] = df['defadd'].fillna('')

# 查看结果
print(df)

输出结果

caseno      defname                                      defadd
0    123  defendant1  [123address, 123address2, 123csz]
1    456  defendant2  [456address, 456address2, 456csz]
2    789  defendant3                                        
3    000  defendant4                                        

额外说明

  • 如果希望未匹配的行显示空列表而非空字符串,只需将fillna('')修改为fillna([])即可。
  • map()是Pandas推荐的向量化操作,相比循环写法,在处理大型数据集时性能提升非常明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:14:05