如何将Pandas DataFrame列中的字典值拆分到指定多列
问题:从嵌套字典列表中提取指定字段到独立新列
原始代码与数据
import numpy as np import pandas as pd data = { 'ID': [112,113],'empDetails':[[{'key': 'score', 'value': 2},{'key': 'Name', 'value': 'Ajay'}, {'key': 'Department', 'value': 'HR'}],[ {'key': 'salary', 'value': 7.5},{'key': 'Name', 'value': 'Balu'}]]} dataDF = pd.DataFrame(data) # 此前尝试的方法(未成功) # dataDF['newColumns'] = dataDF['empDetails'].apply(lambda x: x[0].get('key')) # dataDF = dataDF['empDetails'].apply(pd.Series) # create dataframe # dataDF = pd.DataFrame(dataDF['empDetails'], columns=dataDF['empDetails'].keys()) # create the dataframe # df = pd.concat([pd.DataFrame(v, columns=[k]) for k, v in dataDF['empDetails'].items()], axis=1) # print(dataDF['empDetails'].items()) display(dataDF)
需求说明
现有上述Pandas DataFrame,其中empDetails列的元素是由key-value字典组成的列表。需要遍历该列,将Name、salary、Department对应的value值提取到3个独立新列中。此前尝试用pd.Series拆分字典,但因列顺序不固定无法正确重命名列,需高效可行的实现方法。
解决方案
方法一:直接提取指定字段(高效简洁)
通过apply配合生成器表达式,精准匹配目标key,完全不受字典顺序影响:
import numpy as np import pandas as pd data = { 'ID': [112,113],'empDetails':[[{'key': 'score', 'value': 2},{'key': 'Name', 'value': 'Ajay'}, {'key': 'Department', 'value': 'HR'}],[ {'key': 'salary', 'value': 7.5},{'key': 'Name', 'value': 'Balu'}]]} dataDF = pd.DataFrame(data) # 提取Name字段(假设每条数据都包含该字段) dataDF['Name'] = dataDF['empDetails'].apply(lambda x: next(item['value'] for item in x if item['key'] == 'Name')) # 提取salary和Department,不存在时返回NaN避免报错 dataDF['salary'] = dataDF['empDetails'].apply(lambda x: next((item['value'] for item in x if item['key'] == 'salary'), np.nan)) dataDF['Department'] = dataDF['empDetails'].apply(lambda x: next((item['value'] for item in x if item['key'] == 'Department'), np.nan)) # 可选:删除原empDetails列 dataDF = dataDF.drop('empDetails', axis=1) display(dataDF)
- 核心逻辑:用
next()遍历字典列表,精准定位匹配key的value,缺失字段返回np.nan - 优势:无需拆分整个列表,直接定位目标字段,性能更优,完全规避字典顺序问题
方法二:转字典后扩展为DataFrame(适合多字段提取)
先将每个列表转为标准字典,再扩展为DataFrame,最后合并需要的列:
import numpy as np import pandas as pd data = { 'ID': [112,113],'empDetails':[[{'key': 'score', 'value': 2},{'key': 'Name', 'value': 'Ajay'}, {'key': 'Department', 'value': 'HR'}],[ {'key': 'salary', 'value': 7.5},{'key': 'Name', 'value': 'Balu'}]]} dataDF = pd.DataFrame(data) # 将每个empDetails列表转为{key: value}格式的字典 emp_dict_series = dataDF['empDetails'].apply(lambda x: {item['key']: item['value'] for item in x}) # 字典序列转为DataFrame,自动将所有key转为列 emp_df = pd.DataFrame(emp_dict_series.tolist()) # 合并原数据的ID列与提取后的目标列 result_df = pd.concat([dataDF[['ID']], emp_df[['Name', 'salary', 'Department']]], axis=1) display(result_df)
- 核心逻辑:先统一格式为标准字典,再利用Pandas自动解析字典为列
- 优势:一次提取所有可能的
key为列,后续可灵活选择需要的字段,适合字段较多的场景
内容的提问来源于stack exchange,提问作者USB
相关产品推荐
相关产品推荐

