如何在Pandas中展开嵌套在列中的DataFrame(Unnest操作)
如何展开Pandas DataFrame中嵌套的DataFrame列?
嗨,我来帮你搞定这个问题!你要把DataFrame某一列里的嵌套小DataFrame展开成多行,同时保留原列的关联信息对吧?下面给你两种可行的实现方法,先看最直观的一种:
首先先确认你的模拟数据:
import pandas as pd df = pd.DataFrame.from_dict( { 'col1': [1, 2], 'col2': [pd.DataFrame.from_dict( {'inner_col1': ['one', 'two', 'three'], 'inner_col2': ['four', 'five', 'six']}), pd.DataFrame.from_dict( {'inner_col1': ['seven', 'eight', 'nine'], 'inner_col2': ['ten', 'eleven', 'twelve']}) ] } )
方法一:遍历行并合并(直观易懂)
# 遍历每一行,给嵌套的DataFrame添加col1列,再合并所有结果 result = pd.concat( [row['col2'].assign(col1=row['col1']) for _, row in df.iterrows()], ignore_index=True )[['col1', 'inner_col1', 'inner_col2']] print(result)
运行后就能得到你想要的输出:
col1 inner_col1 inner_col2 0 1 one four 1 1 two five 2 1 three six 3 2 seven ten 4 2 eight eleven 5 2 nine twelve
这个方法的逻辑很清晰:对原DataFrame的每一行,我们把当前行的col1值添加到嵌套的col2 DataFrame里,然后用pd.concat把所有处理后的小DataFrame拼接成一个大的DataFrame,最后调整列的顺序就完美匹配你的需求了。
方法二:更高效的批量处理(适合大数据量)
如果你的数据量比较大,上面的遍历方法可能效率稍低,试试这个更高效的方式:
# 先把col2列的每个DataFrame拆成单独行 df_exploded = df.explode('col2', ignore_index=True) # 合并所有嵌套DataFrame,同时保留对应的col1值 result = pd.concat( df_exploded['col2'].tolist(), keys=df_exploded['col1'] ).reset_index(level=0).rename(columns={'level_0':'col1'}).reset_index(drop=True)
这个方法先通过explode把每个嵌套DataFrame拆成单独的行,然后用pd.concat的keys参数把col1的值关联到对应的嵌套数据上,最后重置索引并调整列名就能得到同样的结果。
为什么你之前的代码失败了?
你尝试的pd.concat(df.drop('col2', axis=1), df.col2)有两个核心问题:
pd.concat的第一个参数需要是可迭代的DataFrame/Series对象集合,而df.drop('col2', axis=1)是一个完整的DataFrame,df.col2是一个Series(每个元素是DataFrame),这样的参数组合不符合pd.concat的要求;- 这种方式没法把
col1的值和对应的嵌套DataFrame行关联起来,自然得不到正确的扁平化结果。
内容的提问来源于stack exchange,提问作者piyush daga
相关产品推荐
相关产品推荐

