如何用groupby().transform()求DataFrame分组众数?遇平局赋值'x'
解决方案
你的核心问题是分组求众数时,平局场景需要返回'x',但原代码直接取mode()的第一个元素,无法识别平局情况。
自定义函数实现逻辑
先定义处理单组的函数,通过判断众数数量识别平局:
def get_majority_vote(series): modes = series.mode() # 众数数量大于1则判定为平局,返回'x';否则返回唯一众数 return 'x' if len(modes) > 1 else modes.iloc[0]
再通过groupby.transform将函数应用到每个分组:
import pandas as pd lst = [["High", "A"], ["High", "A"], ["High", "B"],["Medium", "A"], ["Medium", "B"], ["Medium", "C"]] df = pd.DataFrame(lst, columns =["Class", "Grade"]) df['Majority_vote'] = df.groupby('Class')['Grade'].transform(get_majority_vote)
运行后得到预期结果:
| Class | Grade | Majority_vote |
|---|---|---|
| High | A | A |
| High | A | A |
| High | B | A |
| Medium | A | x |
| Medium | B | x |
| Medium | C | x |
原代码问题说明
原代码lambda x: x.mode()[0]在平局时,x.mode()会返回包含所有众数的Series(比如Medium组返回['A', 'B', 'C']),取[0]只会拿到第一个元素,而非你预期的nan,因此无法区分平局场景。
内容的提问来源于stack exchange,提问作者Meeow
相关产品推荐
相关产品推荐

