如何基于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
相关产品推荐
相关产品推荐

