本文介绍如何先按某一列(如 ‘y’)分组,再基于每组中指定列(如 ‘x’)的最后一个值进行聚合分组,从而实现动态、无需预知分组键的嵌套式分组逻辑。
在 Pandas 数据分析中,有时需要按“组内某个特征的最终状态”进行再分组——例如:按用户会话(y)分组后,进一步将所有以相同操作(x 的最后一行值)结尾的会话归为一类。这种需求无法通过单层 groupby(‘y’) 直接满足,而需构造一个基于组内末行值的新分组键。
以下以原始数据为例:
import pandas as pd
df = pd.DataFrame({
'x': ['a', 'b', 'c', 'c', 'e', 'f', 'd', 'a', 'b', 'c', 'c', 'e', 'f', 'd'],
'y': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'f', 'f', 'f', 'f', 'g', 'g', 'g'],
})
目标是:
- 先按 ‘y’ 分组(共 4 组:y=’a’, ‘b’, ‘f’, ‘g’);
- 提取每组中 ‘x’ 列的最后一个值(即 y=’a’ 组末行为 ‘c’,y=’b’ 组末行为 ‘d’,依此类推);
- 再按这些“组末 x 值”(如 ‘c’, ‘d’)统一聚类,得到两个大组。
✅ 推荐方案:使用 groupby().transform(‘last’)
最清晰、可读性强且健壮的方式是借助 transform(‘last’) 构造辅助列:
# 步骤1:按 'y' 分组,提取每组 'x' 的最后一个值,广播到该组所有行
last_x_per_y = df.groupby('y')['x'].transform('last')
# 步骤2:按此新列再次分组
for last_val, group in df.groupby(last_x_per_y):
print(f"\nGroup where last 'x' in 'y'-group is: '{last_val}'")
print(group)
输出: