如何将DataFrame中含字典列表的列拆分为多个新列?
解决Pandas中从字典列表提取键为新列的问题
原始数据场景
你有如下结构的Pandas DataFrame,其中column2列的每行是一个字典列表:
import pandas as pd data = [{"id":1, "column1":123, "column2":[{"a":1}, {"b":"X"}, {"c":"2023-01-16"}]}] df = pd.DataFrame(data)
原始DataFrame输出:
id column1 column2 0 1 123 [{'a': 1}, {'b': 'X'}, {'c': '2023-01-16'}]
需求目标
需要将column2中的字典提取键作为新列,得到如下结构的DataFrame:
id column1 a b c 0 1 123 1 X 2023-01-16
你尝试的方法及问题
你尝试使用explode分解列表,再用apply(pd.Series)转换字典,但结果不符合预期:
df = df.explode(column="column2") # 分解后的输出: # id column1 column2 # 0 1 123 {'a': 1} # 0 1 123 {'b': 'X'} # 0 1 123 {'c': '2023-01-16'} df["column2"].apply(pd.Series) # 转换后的输出(存在大量空值): # a b c # 0 1.0 NaN NaN # 0 NaN X NaN # 0 NaN NaN 2023-01-16
两种可行的解决方法
方法一:合并字典列表为单个字典后转列
直接将每行的字典列表合并成一个完整字典,再转换为Series与原表拼接:
# 合并每行的字典列表为单个字典,转成Series后与原表拼接 df = df.join(df['column2'].apply(lambda x: pd.Series({k: v for d in x for k, v in d.items()}))) # 删除原column2列 df = df.drop('column2', axis=1)
执行后即可得到目标结构:
id column1 a b c 0 1 123 1 X 2023-01-16
方法二:分解后分组聚合
基于你尝试的explode思路,补充分组聚合步骤来消除空值:
# 分解column2的列表 df_exploded = df.explode('column2') # 将字典转换为列 df_new = df_exploded['column2'].apply(pd.Series) # 拼接原始列与新列,按id和column1分组取首个非空值 result = pd.concat([df_exploded[['id', 'column1']], df_new], axis=1)\ .groupby(['id', 'column1']).first().reset_index()
该方法通过分组聚合将分散在不同行的有效值合并到同一行,最终结果与目标一致。
内容的提问来源于stack exchange,提问作者Bera
相关产品推荐
相关产品推荐

