如何在分组DataFrame中获取各分组下对应列的最频繁出现值?
解决方案
你遇到的报错是因为SeriesGroupBy对象没有直接的mode方法,需要通过agg或apply来对分组数据计算众数。以下是两种简便的实现方式:
方法一:使用agg直接聚合(推荐)
这种方式直接按分组计算指定列的众数,并且每个分组仅保留一行结果,代码简洁高效:
import pandas as pd # 假设你的DataFrame名为df result_df = df.groupby('company_name', as_index=False).agg( company_size=('company_size', lambda x: x.mode().iloc[0]), company_acitivity=('company_acitivity', lambda x: x.mode().iloc[0]) )
as_index=False保证分组后的company_name作为普通列存在,而非索引lambda x: x.mode().iloc[0]用于提取分组内的第一个众数(若存在多个众数,可根据需求调整逻辑)
方法二:使用transform配合去重
如果需要保留原DataFrame的其他列(若有的话),可以先通过transform将列值替换为分组众数,再去重:
# 替换分组内的列值为众数 df['company_size'] = df.groupby('company_name')['company_size'].transform(lambda x: x.mode().iloc[0]) df['company_acitivity'] = df.groupby('company_name')['company_acitivity'].transform(lambda x: x.mode().iloc[0]) # 按company_name去重,保留每个公司的一行数据 result_df = df.drop_duplicates(subset='company_name', keep='first')
注意事项
如果某个分组的列中所有值都是唯一的,mode()会返回该列的所有值,此时iloc[0]会取第一个值。若需要处理这种特殊场景,可以在lambda中添加判断逻辑,比如:
lambda x: x.mode().iloc[0] if not x.mode().empty else x.iloc[0]
内容的提问来源于stack exchange,提问作者julez8000
相关产品推荐
相关产品推荐

