如何自动展开Pandas DataFrame中含字典列表的列并生成新列
自动展开Pandas中存储字典列表的列
先还原你的示例数据:
import pandas as pd data = { 'col1': ['val1', 'val11'], 'col2': ['val2', 'val22'], 'combine_col1': [[{'x1':'v1','x2':'v2'}], [{'x1':'v11','x2':'v22'}]], 'combine_col2': [[{'x3':'v3','x4':'v4','x5':'v5'}], [{'x3':'v33','x4':'v44','x5':'v55'}]] } df = pd.DataFrame(data)
以下是自动化展开的实现步骤:
- 识别需要展开的列
遍历所有列,判断列中存储的是否是字典列表(每个单元格为包含字典的列表):
def is_list_of_dicts(series): # 取第一个非空元素判断类型 first_non_null = series.dropna().iloc[0] if not series.dropna().empty else None return isinstance(first_non_null, list) and len(first_non_null) > 0 and isinstance(first_non_null[0], dict) # 筛选出需要展开的目标列 expand_cols = [col for col in df.columns if is_list_of_dicts(df[col])]
- 逐个展开目标列
对每个目标列,先提取列表中的字典(示例中每个列表仅含一个字典),再用pd.json_normalize将字典展开为新列:
expanded_dfs = [] for col in expand_cols: # 提取列表内的字典元素 dict_series = df[col].str[0] # 展开字典为DataFrame expanded_df = pd.json_normalize(dict_series) expanded_dfs.append(expanded_df)
- 合并最终结果
保留原DataFrame中无需展开的列,再与所有展开后的列合并:
# 筛选无需展开的列 non_expand_cols = [col for col in df.columns if col not in expand_cols] # 横向合并所有DataFrame result = pd.concat([df[non_expand_cols]] + expanded_dfs, axis=1)
运行后result的列名即为col1、col2、x1、x2、x3、x4、x5,完全符合需求。如果后续遇到单元格包含多个字典的情况,可在提取字典前添加df[col].explode()拆分列表,再进行展开操作。
内容的提问来源于stack exchange,提问作者Dcook
相关产品推荐
相关产品推荐

