跳转到内容

深入 groupby:遍历与自定义操作

大多数时候你用 agg()transform() 就能完成分组计算。但有些场景需要你对每个组做更复杂的操作——比如对每个模型的数据分别跑一个独立的分析流程,或者把每组的结果保存为单独的文件。这时候就需要了解 groupby 对象的内部结构。

遍历 groupby 对象

python
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'model': ['GPT-4o']*5 + ['Claude']*5 + ['Llama']*5,
    'score': np.random.uniform(80, 95, 15),
})

for name, group in df.groupby('model'):
    print(f"\n=== {name} ({len(group)} 条) ===")
    print(f"  均值: {group['score'].mean():.1f}")
    print(f"  最高: {group['score'].max():.1f}")

groupby 对象是可迭代的,每次迭代返回一个 (组名, 组DataFrame) 元组。这让你能对每个组执行任意 Python 代码——不限于 Pandas 内置的聚合函数。

get_group():提取单个组

python
gpt_group = df.groupby('model').get_group('GPT-4o')
print(gpt_group)

当你只需要某个特定组的数据时(而不是遍历所有组),get_group()for 循环加 if 判断更直接也更高效——它不需要创建所有组的中间对象。

实战:按组导出独立文件

python
import os
from pathlib import Path

output_dir = Path('./output/by_model')
output_dir.mkdir(parents=True, exist_ok=True)

for name, group in df.groupby('model'):
    out_path = output_dir / f'{name}_data.parquet'
    group.to_parquet(out_path, index=False)
    print(f"已导出: {out_path.name} ({len(group)} 条)")

这个模式在 LLM 数据处理中非常常见:按模型/来源/语言等维度把大数据集拆分成小文件,分发给不同的下游处理流程或团队成员。

基于 MIT 许可发布