如何将DataFrame中含字典列表的Series转换为指定格式DataFrame?
解决方法
方法一:直接用apply处理detail列
遍历detail列的每个字典列表,提取对应字段后用分隔符拼接,直接生成目标列,代码简洁直观:
import pandas as pd data = [ { "id": 1, "detail": [ {"name": "name1", "type": "type1"}, {"name": "name2", "type": "type2"}, ] }, { "id": 2, "detail": [ {"name": "name3", "type": "type3"}, {"name": "name4", "type": "type4"}, ] }, ] df = pd.DataFrame(data) # 生成拼接后的name和type列 df['detail_name'] = df['detail'].apply(lambda x: ' | '.join([d['name'] for d in x])) df['detail_type'] = df['detail'].apply(lambda x: ' | '.join([d['type'] for d in x])) # 保留需要的列 result_df = df[['id', 'detail_name', 'detail_type']] print(result_df)
输出结果:
id detail_name detail_type 0 1 name1 | name2 type1 | type2 1 2 name3 | name4 type3 | type4
方法二:先展开再分组聚合
基于你尝试的pd.json_normalize,先展开所有字典条目,再按id分组拼接,适合需要先对明细做额外处理的场景:
import pandas as pd data = [ { "id": 1, "detail": [ {"name": "name1", "type": "type1"}, {"name": "name2", "type": "type2"}, ] }, { "id": 2, "detail": [ {"name": "name3", "type": "type3"}, {"name": "name4", "type": "type4"}, ] }, ] # 展开detail列表,同时关联原id details = pd.json_normalize(data, record_path=['detail'], meta=['id'], record_prefix='detail_') # 按id分组,拼接同组的name和type result_df = details.groupby('id').agg( detail_name=('detail_name', ' | '.join), detail_type=('detail_type', ' | '.join) ).reset_index() print(result_df)
输出结果与方法一完全一致。
注意事项
- 分隔符可随意替换,只需修改
' | '.join中的字符串(比如换成'; '或空格)即可。 - 方法一适合小数据量场景,代码更精简;方法二更适配大数据量或需要先清洗明细数据的需求。
内容的提问来源于stack exchange,提问作者Luiz
相关产品推荐
相关产品推荐

