You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含列表列的Pandas DataFrame转换为扁平化结构?

如何将包含列表列的Pandas DataFrame扁平化

我用Pandas创建了如下DataFrame:

import pandas as pd
import numpy as np

dat = pd.concat([pd.DataFrame({'X' : 1, 'Y' : [[1,2]], 'Z' : [['A', 'B']]}), pd.DataFrame({'X' : 11, 'Y' : [[11,21,31]], 'Z' : [['AA', 'BB', 'CC']]})], axis = 0)

它的结构是:

X             Y               Z
0    1        [1, 2]          [A, B]
0   11  [11, 21, 31]    [AA, BB, CC]

我希望把它转换成以下扁平化结构:

print(pd.DataFrame({'X' : [1,1,11,11,11], 'Y' : [1,2,11,21,31], 'Z' : ['A', 'B', 'AA', 'BB', 'CC']}))

预期输出:

X   Y   Z
0   1   1   A
1   1   2   B
2  11  11  AA
3  11  21  BB
4  11  31  CC

解决方案

方法1:使用explode()(推荐,Pandas 0.25+支持)

Pandas内置的explode()方法可以直接将包含列表的列展开,自动匹配对应行的其他列值。因为你的Y和Z列的列表长度完全对应,可同时对两列执行展开:

flattened_df = dat.explode(['Y', 'Z'], ignore_index=True)

ignore_index=True会重置索引为连续序列,最终结果完全符合预期结构。

方法2:手动展开(兼容旧版Pandas)

如果你的Pandas版本低于0.25,可以通过逐行处理拼接实现:

def flatten_row(row):
    return pd.DataFrame({
        'X': [row['X']] * len(row['Y']),
        'Y': row['Y'],
        'Z': row['Z']
    })

flattened_df = pd.concat([flatten_row(row) for _, row in dat.iterrows()], ignore_index=True)

验证结果

两种方法执行后,输出结果均为:

X   Y   Z
0   1   1   A
1   1   2   B
2  11  11  AA
3  11  21  BB
4  11  31  CC

内容的提问来源于stack exchange,提问作者Bogaso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:45:39