如何将Pandas DataFrame中的列表型列展平?
如何将包含列表的Pandas DataFrame展开扁平化?
我有这样一个数据结构:
ds = [{ "name": "groupA", "subGroups": [123,456] }, { "name": "groupB", "subGroups": ['aaa', 'bbb' , 'ccc'] }]转换成Pandas DataFrame后得到
df:
name subGroups 0 groupA [123, 456] 1 groupB ['aaa', 'bbb', 'ccc'] 我希望把它转换成如下结构的DataFrame:
name subGroupsFlattend 0 groupA 123 1 groupA 456 2 groupB aaa 3 groupB bbb 4 groupB ccc 请问有实现思路吗?
当然有啦!最直接且高效的方案就是用Pandas自带的explode()函数,它就是专门为处理这种包含列表的列设计的——能把列表里的每个元素拆成单独的行,同时自动保留其他列的对应值。
方法一:使用explode()(推荐,Pandas 0.25.0+可用)
步骤很简单:
- 先导入Pandas并创建初始DataFrame:
import pandas as pd ds = [{ "name": "groupA", "subGroups": [123,456] }, { "name": "groupB", "subGroups": ['aaa', 'bbb' , 'ccc'] }] df = pd.DataFrame(ds)
- 调用
explode()拆分列表列,再重命名列名到你想要的样式:
df_flattened = df.explode('subGroups').rename(columns={'subGroups': 'subGroupsFlattend'})
执行后打印df_flattened,就是你想要的扁平化结构啦!
方法二:兼容旧版Pandas(0.25.0以下)
如果你还在使用比较旧的Pandas版本,explode()还没被引入,可以用apply配合pd.Series来实现:
# 先把name设为索引,避免拆分时丢失对应关系 df_flattened = df.set_index('name')['subGroups'].apply(pd.Series).stack().reset_index(name='subGroupsFlattend') # 删掉拆分后自动生成的多余列level_1 df_flattened = df_flattened.drop('level_1', axis=1)
这个方法本质是把列表拆成多列,再堆叠成行,最终也能得到目标结构。
内容的提问来源于stack exchange,提问作者More Than Five
相关产品推荐
相关产品推荐

