如何将含列表列的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
相关产品推荐
相关产品推荐

