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

如何基于DataFrame数组列的值添加新列?解决重复值及KeyError问题

提取DataFrame数组列中的字典值生成新列问题解决

问题背景

现有如下结构的DataFrame,其中Version列是数组类型,每个数组内包含一个字典:

Key    Version
0    ABC-1  [{'name': 'v1', 'releaseDate': '2023-01-01'}]
1    ABC-2  [{'name': 'v2', 'releaseDate': '2023-02-01'}]
2    ABC-3  [{'name': 'v3', 'releaseDate': '2023-03-01'}]

最初尝试直接赋值:

df["NewColumn"] = df["Version"][0][0]['name']

结果所有行的新列都取了第一行的v1:

Key    Version                                         NewColumn
0    ABC-1  [{'name': 'v1', 'releaseDate': '2023-01-01'}]   v1
1    ABC-2  [{'name': 'v2', 'releaseDate': '2023-02-01'}]   v1
2    ABC-3  [{'name': 'v3', 'releaseDate': '2023-03-01'}]   v1 

改用apply+lambda时出现KeyError: 0:

df["NewColumn"] = df.apply(lambda row: row.Version[0][0]['name'], axis=1)

错误原因分析

  • 直接赋值的问题:df["Version"][0][0]['name']是固定获取第一行数组中第一个元素的name值,将这个单一值赋值给整列,导致所有行内容相同。
  • KeyError的原因:row.Version是当前行的数组,row.Version[0]已经是数组内的字典,额外多写的[0]会尝试去字典中找键0,而字典只有name和releaseDate键,因此报错。

正确解法

方法1:修正apply+lambda写法

去掉多余的索引,直接取数组第一个元素(字典)的name值:

df["NewColumn"] = df.apply(lambda row: row.Version[0]['name'], axis=1)

方法2:使用pandas.str索引(更高效)

利用pandas对数组列的str操作,直接提取数组元素和字典键,性能优于apply:

df["NewColumn"] = df["Version"].str[0].str['name']

方法3:批量展开字典所有字段(可选)

如果需要把字典中的所有键都转为新列,可以用pd.json_normalize:

import pandas as pd

# 提取每个Version数组中的字典元素
version_dicts = df["Version"].str[0]
# 将字典展开为DataFrame
expanded_df = pd.json_normalize(version_dicts)
# 和原DataFrame横向合并
df = pd.concat([df, expanded_df], axis=1)

执行后会新增name和releaseDate两列,无需单独提取单个字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:17:43