如何迭代选取Pandas DataFrame对应行并排序合并为单个DataFrame
按行分组排序拼接多个DataFrame
需求说明
从包含多个Pandas DataFrame的字典中,按行号依次提取所有DataFrame的对应行(第1行、第2行……第n行),将每组提取的行按my_value列排序后,依次拼接成一个新的DataFrame。
实现代码
import pandas as pd # 定义原始数据 data1 = {'A': [1, 2, 3], 'B': [4, 5, 6], 'my_value': [0.1, 0.4, 0.3]} df1 = pd.DataFrame(data1) data2 = {'A': [7, 8, 9], 'B': [10, 11, 12], 'my_value': [0.2, 0.5, 0.6]} df2 = pd.DataFrame(data2) data3 = {'A': [13, 14, 15], 'B': [16, 17, 18], 'my_value': [0.9, 0.8, 0.7]} df3 = pd.DataFrame(data3) dfs = {'df1': df1, 'df2': df2, 'df3': df3} # 核心处理逻辑 result_list = [] # 获取DataFrame的行数(假设所有DataFrame行数一致) total_rows = next(iter(dfs.values())).shape[0] for row_idx in range(total_rows): # 提取所有DataFrame的第row_idx行 current_rows = [df.iloc[row_idx:row_idx+1] for df in dfs.values()] # 合并为临时DataFrame temp_df = pd.concat(current_rows, ignore_index=True) # 按my_value列排序 sorted_df = temp_df.sort_values(by='my_value', ignore_index=True) # 加入结果列表 result_list.append(sorted_df) # 拼接所有排序后的分组 final_result = pd.concat(result_list, ignore_index=True) print(final_result)
输出结果
A B my_value 0 1 4 0.1 1 7 10 0.2 2 13 16 0.9 3 2 5 0.4 4 8 11 0.5 5 14 17 0.8 6 3 6 0.3 7 9 12 0.6 8 15 18 0.7
关键说明
- 使用
iloc[row_idx:row_idx+1]而非iloc[row_idx],确保提取的是DataFrame格式而非Series,避免拼接时出现格式问题。 - 假设字典中所有DataFrame的行数一致,若存在行数不同的情况,可以改为取最小行数
min(df.shape[0] for df in dfs.values()),或对缺失行做填充处理。 - 每次分组排序后通过列表收集,最后一次性拼接,比逐次拼接更高效。
内容的提问来源于stack exchange,提问作者sato
相关产品推荐
相关产品推荐

