You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:08:23