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

未知列名时对Pandas DataFrame分组应用多规则聚合的实现

Pandas多Key分组聚合解决方案:未知列名下的动态聚合处理

问题背景

现有百万行、数百列规模的Pandas DataFrame,包含Key列、若干数值列(命名含Value)、若干时间戳列(命名含Timestamp)、Id列。部分Key对应多行,行内数值/时间戳列存在值差异,需完成:

  1. 筛选对应多行的Key;
  2. 识别每个Key下存在值差异的列;
  3. 按规则聚合:
    • 数值列:同Key下值相同取平均,不同则求和;
    • 时间戳列:Timestamp1取最小值,Timestamp2/Timestamp3取最大值;
    • Id列:取对应Value1最大的行的Id;
    • 排除同Key下值完全相同的列;
  4. 输出包含Key、CountOfrows(每组行数)及聚合后列的结果。

已筛选出多行Key及差异列,但原循环处理效率极低,需实现未知列名前提下的动态聚合。

解决方案

1. 高效识别各Key下的差异列(替代原循环)

用批量统计替代逐行循环,适配百万级数据:

# 筛选存在多行的Key
key_counts = sample_df.groupby('Key').size().reset_index(name='CountOfrows')
multi_key_df = key_counts[key_counts['CountOfrows'] > 1]
target_keys = multi_key_df['Key'].tolist()

# 提取目标Key对应的子集
subset_df = sample_df[sample_df['Key'].isin(target_keys)]

# 统计每个Key下各列的唯一值数量,标记差异列
unique_counts = subset_df.groupby('Key').nunique()
diff_cols_mask = unique_counts > 1
key_diff_cols = diff_cols_mask.apply(lambda x: x[x].index.tolist(), axis=1).reset_index(name='diff_cols')

2. 动态构建聚合规则字典

根据列类型自动匹配聚合逻辑:

# 分类列类型
value_cols = [col for col in sample_df.columns if 'Value' in col]
timestamp_cols = [col for col in sample_df.columns if 'Timestamp' in col]
id_col = 'Id'

# 初始化聚合字典
agg_dict = {'CountOfrows': 'first'}

# 数值列聚合:动态判断值是否唯一,选择平均/求和
def value_agg(series):
    return series.mean() if series.nunique() == 1 else series.sum()

for col in value_cols:
    agg_dict[col] = value_agg

# 时间戳列聚合:按指定规则分配min/max
for col in timestamp_cols:
    if col == 'Timestamp1':
        agg_dict[col] = 'min'
    elif col in ['Timestamp2', 'Timestamp3']:
        agg_dict[col] = 'max'

# Id列聚合:取对应Value1最大的行的Id
def id_agg(group):
    return group.loc[group['Value1'].idxmax(), id_col]

agg_dict[id_col] = id_agg

3. 执行聚合并排除无差异列

# 执行分组聚合
result = subset_df.groupby('Key').agg(agg_dict).reset_index()

# 排除所有Key下值均无差异的列
global_unique_counts = subset_df.groupby('Key').nunique().max()
cols_to_keep = ['Key', 'CountOfrows', id_col] + [
    col for col in value_cols + timestamp_cols 
    if global_unique_counts[col] > 1
]

final_result = result[cols_to_keep]

核心优势

  • 放弃逐行循环,用groupby.nunique()批量统计,效率提升显著;
  • 数值列聚合逻辑动态判断,无需预先知晓差异列;
  • 自动适配列名规则,无需硬编码所有列;
  • 最后通过全局统计排除全组无差异列,精准匹配需求。

内容的提问来源于stack exchange,提问作者Abhishek Sourabh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:50:19