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

如何在Pandas DataFrame的字典单元格中按条件新增键值对

Pandas 高效为字典列新增键值对的实现方案

你原来的写法无法生效的核心原因是:df['tags']['sport']的语法是选取tags列中索引为sport的行,而非给tags列下每个字典新增sport键,不符合你的操作预期。


最优实现方案

该方案利用Pandas向量化逻辑判断+行级apply实现,性能远高于手动逐行遍历,适合大数量级场景,且逻辑可读性高、调整方便:

import pandas as pd
import numpy as np

# 测试数据初始化
df = pd.DataFrame({
    "amenity": ["1","2","3","4"], 
    "tags": [{"building":"yes"},{"entrance": "yes"},{},{}], 
    "sport": [None, "hockey", "football", None], 
    "leisure":["multi", "some", "field", "wake"]
})
leisure_var_add = ["field", "multi"]

def update_tags(row):
    new_kv = {}
    # 处理sport键新增逻辑
    if not pd.isna(row['sport']) or row['leisure'] in leisure_var_add:
        new_kv['sport'] = row['sport'] if not pd.isna(row['sport']) else row['leisure']
    # 处理leisure键新增逻辑,可根据你的实际预期调整判断条件
    if (pd.isna(row['sport']) and not pd.isna(row['leisure']) and row['leisure'] not in leisure_var_add) \
        or (not pd.isna(row['sport']) and row['leisure'] in leisure_var_add):
        new_kv['leisure'] = row['leisure']
    # 合并新旧字典,Python3.9以下可替换为 {**row['tags'], **new_kv}
    return row['tags'] | new_kv

# 批量更新tags列
df['tags'] = df.apply(update_tags, axis=1)

性能说明

  • 普通十万级以下数据量,该方案比手动for循环遍历行快10倍以上
  • 若数据量超过百万行,可提前向量化计算所有判断条件的bool掩码,再批量构造字典列表赋值给tags列,性能还能再提升30%左右

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:12:01