如何遍历81个DataFrame并基于列均值分组合并?
按指定列均值分组合并DataFrame列表
我有一个包含81个不同DataFrame的列表,需要完成以下操作:
- 计算每个DataFrame中同一列(示例中为
Töltőtömeg)的平均值 - 根据这些平均值将DataFrame分组,把均值相近的归为一组
- 将同一组内的DataFrame合并为新的DataFrame
示例数据
import pandas as pd df1 = pd.DataFrame({'ID':['1','2','3','4','5'], 'Töltőtömeg':['70','69','71','70','70.5']}) df2 = pd.DataFrame({'ID':['1','2','3','4','5'], 'Töltőtömeg':['72','69','70','70','71.5']}) df3 = pd.DataFrame({'ID':['1','2','3','4','5'], 'Töltőtömeg':['148','149','150','151','151']}) df4 = pd.DataFrame({'ID':['1','2','3','4','5'], 'Töltőtömeg':['150','150','151','149','148']}) df_list = [df1, df2, df3, df4]
预期输出
合并后的df12:
ID Töltőtömeg 0 1 70 1 2 69 2 3 71 3 4 70 4 5 70.5 5 1 72 6 2 69 7 3 70 8 4 70 9 5 71.5
合并后的df34:
ID Töltőtömeg 0 1 148 1 2 149 2 3 150 3 4 151 4 5 151 5 1 150 6 2 150 7 3 151 8 4 149 9 5 148
解决方案步骤
1. 统一数据类型并计算每个DataFrame的均值
先确保目标列是数值类型,再计算每个DataFrame的均值并存储对应关系:
# 转换目标列为数值型,处理异常值 df_mean_list = [] for idx, df in enumerate(df_list): df['Töltőtömeg'] = pd.to_numeric(df['Töltőtömeg'], errors='coerce') # 计算列均值 mean_val = df['Töltőtömeg'].mean() df_mean_list.append((idx, mean_val))
2. 对均值进行聚类分组
针对81个DataFrame的场景,用聚类算法自动分组更高效,示例中设定为2组,可根据实际数据调整:
from sklearn.cluster import KMeans import numpy as np # 提取均值数组 means = np.array([val for _, val in df_mean_list]).reshape(-1, 1) # 初始化聚类模型 kmeans = KMeans(n_clusters=2, random_state=42) labels = kmeans.fit_predict(means) # 建立组标签与DF索引的映射 groups = {} for (df_idx, _), label in zip(df_mean_list, labels): if label not in groups: groups[label] = [] groups[label].append(df_idx)
3. 合并同组的DataFrame
遍历每个分组,将组内所有DataFrame合并为新的DataFrame:
merged_dfs = {} for group_label, df_indices in groups.items(): # 取出组内所有DataFrame并合并 group_dfs = [df_list[idx] for idx in df_indices] merged_df = pd.concat(group_dfs, ignore_index=True) # 自定义合并后DataFrame的名称 merged_name = f"df{''.join(str(idx+1) for idx in df_indices)}" merged_dfs[merged_name] = merged_df # 查看合并结果 print(merged_dfs['df12']) print(merged_dfs['df34'])
补充说明
- 若不需要自动聚类,也可自定义阈值判断均值是否相近(比如均值差小于设定值则归为一组),但聚类更适合大量数据的批量分组场景。
- 转换列类型时,
errors='coerce'会将无法转换的值设为NaN,计算均值时会自动忽略,可根据需求提前处理异常值。
内容的提问来源于stack exchange,提问作者Lehel Tompos
相关产品推荐
相关产品推荐

