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

如何从DataFrame的metadata列安全提取姓名且保留所有行?

解决方案

你的代码主要存在两个问题:

  1. 使用continue跳过无姓名的行,导致返回的names列表长度与原DataFrame行数不匹配,赋值时触发索引错误
  2. 虽然用了get()判断键是否存在,但后续仍用[]直接访问,逻辑冗余且没彻底规避Key风险

以下是两种可靠的解决方式,均能保留所有行,同时安全提取姓名:

方法一:使用apply函数(推荐,更简洁)

利用Pandas的apply逐行处理列元素,结合字典的get()方法安全取值:

import pandas as pd

def extract_full_name(metadata_item):
    if pd.isna(metadata_item):
        return None  # 无数据时返回空值,也可改为''根据需求调整
    person_dict = metadata_item[0]
    # 键不存在时返回空字符串,避免KeyError
    first_name = person_dict.get('firstName', '')
    last_name = person_dict.get('lastName', '')
    # 组合全名,去除多余空格;若两个字段都为空则返回None
    full_name = f"{first_name} {last_name}".strip()
    return full_name if full_name else None

# 替换原metadata列
df['metadata'] = df['metadata'].apply(extract_full_name)

方法二:修正循环逻辑

确保每个行都对应添加一个元素到结果列表,避免长度不匹配:

import pandas as pd

def name(df_col):
    names = []
    for item in df_col:
        if pd.isna(item):
            names.append(None)
            continue
        person = item[0]
        # 安全获取姓名,不存在则为空串
        first = person.get('firstName', '')
        last = person.get('lastName', '')
        full_name = f"{first} {last}".strip()
        names.append(full_name if full_name else None)
    return names

df['metadata'] = name(df['metadata'])

关键优化点:

  • 每个行都生成对应的结果元素,保证列表长度与原DataFrame一致,彻底解决索引不匹配问题
  • 用dict.get(key, default)替代直接[]访问,当键不存在时返回默认值,完全避免KeyError
  • 处理了NaN值的情况,保留原行位置不丢失其他列数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:50:25