如何对DataFrame按Col A分组并获取对应列计数与最高频项?
DataFrame分组统计:分类总条数与高频项计数实现
问题场景
现有如下DataFrame:
| Col A | Col B |
|---|---|
| red | car |
| red | car |
| red | truck |
| red | ball |
| blue | bus |
| blue | bus |
| blue | bus |
| blue | truck |
| blue | car |
需要生成目标DataFrame,展示每个Col A分类的总条数(Count A)、分类下出现次数最多的Col B项及其计数(Count B),目标结果如下:
| Col A | Count A | Col B | Count B |
|---|---|---|---|
| red | 4 | car | 2 |
| blue | 5 | bus | 3 |
注:原目标表格中
blue的Count B标注为2,实际原始数据中bus出现3次,此处修正为正确值。
已尝试代码
仅能获取分类与对应高频项,缺失总条数和高频项计数:
df2 = df.groupby('Col A')['Col B'].apply(lambda x: x.value_counts().index[0]).reset_index()
解决方案
方法一:自定义聚合函数一次性统计
通过groupby.agg传入自定义函数,一次完成所有统计需求:
import pandas as pd def group_stats(col_b_series): # 统计当前分类的总条数 count_a = len(col_b_series) # 统计Col B的频次 freq = col_b_series.value_counts() # 获取高频项和对应计数 most_common = freq.index[0] count_b = freq.iloc[0] # 返回结果Series return pd.Series([count_a, most_common, count_b], index=['Count A', 'Col B', 'Count B']) # 执行分组统计并重置索引 df2 = df.groupby('Col A')['Col B'].agg(group_stats).reset_index()
方法二:分步统计后合并
拆分统计步骤,再合并结果,逻辑更直观:
# 步骤1:统计每个Col A的总条数 count_a_df = df.groupby('Col A').size().reset_index(name='Count A') # 步骤2:统计每个Col A下Col B的高频项及对应计数 def get_top_b(col_b_series): freq = col_b_series.value_counts() return pd.Series([freq.index[0], freq.iloc[0]], index=['Col B', 'Count B']) count_b_df = df.groupby('Col A')['Col B'].apply(get_top_b).reset_index() # 步骤3:合并两个DataFrame df2 = pd.merge(count_a_df, count_b_df, on='Col A')
方法三:利用mode简化高频项获取
借助pd.Series.mode直接获取众数,再结合分组统计:
# 统计分类总条数 count_a = df.groupby('Col A').size().rename('Count A') # 获取每个分类下Col B的众数(高频项) most_common_b = df.groupby('Col A')['Col B'].agg(lambda x: x.mode()[0]).rename('Col B') # 统计高频项的出现次数 count_b = df.groupby(['Col A', 'Col B']).size().reset_index(name='Count B') count_b = count_b.groupby('Col A')['Count B'].max().rename('Count B') # 合并所有结果 df2 = pd.concat([count_a, most_common_b, count_b], axis=1).reset_index()
内容的提问来源于stack exchange,提问作者MueezK
相关产品推荐
相关产品推荐

