如何 groupby().transform() 在数据框中查找模式?

2023-12-07

我有一个像这样的数据框:

lst = [["High", "A"], ["High", "A"], ["High", "B"],["Medium", "A"], ["Medium", "B"], ["Medium", "C"]]

df = pd.DataFrame(lst, columns =["Class", "Grade"])

我需要获得每个“班级”中“等级”的模式(多数票)。 如果票数相同,则指定“x”。

以下是我期望得到的:

Class Grade Majority_vote
High A A
High A A
High B A
Medium A x
Medium B x
Medium C x

这是我的代码:

df['majority_vote'] = df.groupby(['Class'])['Grade'].transform(lambda x: x.mode()[0])

我认为如果票数相同,代码将返回“nan”。然后,我稍后会将“nan”更改为“x”。

但是,我得到的如下:

Class Grade Majority_vote
High A A
High A A
High B A
Medium A A
Medium B A
Medium C A

在“Medium”类中,代码返回第一个元素(“A”)而不是“nan”。

任何其他方法都值得赞赏。 请你帮助我好吗?先感谢您。


使用的问题x.mode()[0]就是它pd.Series(['A', 'B', 'C']).mode()评估为['A', 'B', 'C']。同时,pd.Series(['A', 'A', 'B']).mode()评估为['A'].

这是一个函数,它将返回众数(如果只有一个众数),如果存在平局(即多个众数),则返回“x”。

import pandas as pd
lst = [["High", "A"], ["High", "A"], ["High", "B"],["Medium", "A"], ["Medium", "B"], ["Medium", "C"]]
df = pd.DataFrame(lst, columns=["Class", "Grade"])

def get_mode_or_x(series):
    mode = series.mode()
    if mode.size == 1:
        return mode[0]
    return "x"

df.loc[:, "majority_vote"] = df.groupby("Class")["Grade"].transform(get_mode_or_x)
index Class Grade majority_vote
0 High A A
1 High A A
2 High B A
3 Medium A x
4 Medium B x
5 Medium C x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何 groupby().transform() 在数据框中查找模式? 的相关文章

随机推荐