如何按不同列存储的复合分组(cohort)对DataFrame分组?
按多列参数所有可能组合分组计算指标的实现方法
嘿,这个需求在Pandas里其实非常直观就能搞定!下面我分两种常见场景给你详细说明:
场景1:仅按数据中存在的组合分组
如果你只需要对原始数据里实际存在的参数组合进行分组计算,直接用groupby方法传入所有分组列的列表就可以了,非常简单。
举个具体的例子,假设你的DataFrame是这样的:
import pandas as pd # 构造示例数据 data = { 'animal': ['duck', 'cat', 'dog', 'duck', 'cat'], 'color': ['white', 'grey', 'black', 'grey', 'black'], 'size': ['small', 'big', 'small', 'big', 'small'], 'value': [10, 20, 15, 25, 30] } df = pd.DataFrame(data)
要按animal、color、size三列的所有存在组合分组,计算value的均值和总和,代码可以这么写:
# 按多列分组,计算多个指标 grouped_results = df.groupby(['animal', 'color', 'size']).agg( mean_value=('value', 'mean'), total_value=('value', 'sum'), count=('value', 'count') ).reset_index() print(grouped_results)
这样得到的结果里,只会包含原始数据中出现过的组合,比如small white duck、big grey cat这些实际有数据的分组。
场景2:强制包含所有理论上的参数组合(含无数据的分组)
如果你的需求是不管数据中有没有,都要显示所有可能的参数组合(比如没有数据的分组填充0或者NaN),那可以先通过pd.MultiIndex.from_product生成所有可能的组合,再和分组结果合并。
接上面的示例,先定义每列的所有可能取值:
# 定义各列的所有可能取值 all_animals = ['duck', 'cat', 'dog'] all_colors = ['white', 'grey', 'black'] all_sizes = ['small', 'big'] # 生成所有可能的组合索引 all_combinations = pd.MultiIndex.from_product( [all_animals, all_colors, all_sizes], names=['animal', 'color', 'size'] ) # 先按存在的组合分组计算 grouped = df.groupby(['animal', 'color', 'size'])['value'].sum() # 重新索引,填充所有组合,缺失值填0 full_results = grouped.reindex(all_combinations, fill_value=0).reset_index() print(full_results)
这样输出的结果里就会包含像big white dog这种原始数据中没有的组合,对应的value总和会是0(你也可以根据需求改成NaN或者其他值)。
补充小技巧
- 如果分组列很多,不想手动列出来,可以直接用
df.columns里的参数列子集,比如假设参数列是前3列,就写df.groupby(df.columns[:3])。 - 分组后的结果默认是多级索引,用
reset_index()可以把分组列变回普通列,方便后续处理。
内容的提问来源于stack exchange,提问作者Versteher
相关产品推荐
相关产品推荐

