如何在Python Pandas中从DataFrame列表生成新DataFrame集合
问题描述
我有一个包含多个DataFrame字典的列表,定义如下:
import pandas as pd df1 = {'col1': ['a', 'a', 'b', 'c', 'c', 'd'], 'col2': [3, 4, 3, 8, 4, 5], 'col3': ['cat', 'cat', 'cat', 'cat', 'cat', 'cat']} df2 = {'col1': ['a', 'a', 'b', 'c', 'c', 'd'], 'col2': [30, 40, 30, 80, 40, 50], 'col3': ['dog', 'dog', 'dog', 'dog', 'dog', 'dog']} df3 = {'col1': ['a', 'a', 'b', 'c', 'c', 'd'], 'col2': [31, 41, 31, 81, 41, 51], 'col3': ['whale', 'whale', 'whale', 'whale', 'whale', 'whale']} dfList = [df1, df2, df3]
需要实现两个需求:
- 生成一个新的DataFrame列表,每个新DataFrame对应
col1中的一个值(含重复值,比如两个a),以col2和col3为列,数据取自原列表中的每个DataFrame。 - 将上述结果整合到单个DataFrame中,按指定格式展示。
解决方案
一、生成对应col1值的DataFrame列表
先将每个字典转为pandas DataFrame,添加行索引标识确保同位置行对应,再拼接所有DataFrame,最后按col1和原行索引分组得到目标列表。
# 转换字典为DataFrame并添加行索引标识 dfs = [] for df_dict in dfList: df = pd.DataFrame(df_dict) df['row_id'] = df.index # 用原行索引区分同一col1的不同组 dfs.append(df) # 拼接所有DataFrame combined_df = pd.concat(dfs, ignore_index=True) # 分组生成目标DataFrame列表 result_list = [] for (col1_val, _), group in combined_df.groupby(['col1', 'row_id']): target_df = group[['col2', 'col3']].copy() # 设置列标题为col1的值 target_df.columns = pd.MultiIndex.from_tuples([(col1_val, 'col2'), (col1_val, 'col3')]) result_list.append(target_df) # 查看第一个结果示例 print(result_list[0])
输出示例:
a col2 col3 0 3 cat 1 30 dog 2 31 whale
二、整合到单个DataFrame
基于拼接后的combined_df,将col1设为索引并排序,利用pandas默认的重复索引隐藏机制实现目标格式。
# 整理数据并设置索引 final_df = combined_df[['col1', 'col2', 'col3']].set_index('col1') # 按col1和组内顺序排序 final_df = final_df.sort_values(by=['col1', final_df.groupby('col1').cumcount()]) # 开启重复索引隐藏显示 pd.set_option('display.multi_sparse', True) print(final_df)
输出示例:
col2 col3 col1 a 3 cat 30 dog 31 whale a 4 cat 40 dog 41 whale b 3 cat 30 dog 31 whale c 8 cat 80 dog 81 whale c 4 cat 40 dog 41 whale d 5 cat 50 dog 51 whale
内容的提问来源于stack exchange,提问作者four-eyes
相关产品推荐
相关产品推荐

