Python 函数使用规则返回最大计数值

Python 函数使用规则返回最大计数值,python,pandas,Python,Pandas,我有两列,如下图所示,并试图返回第二列中的最高计数,但它只是返回评级中的最高计数,而不考虑性别 数据: 打印df AGE GENDER rating 0 10 M PG 1 10 M R 2 10 M R 3 4 F PG13 4 4 F PG13 代码: s = (df.groupby(['AGE', 'GENDER'])['rating'] .apply(la

我有两列,如下图所示,并试图返回第二列中的最高计数,但它只是返回评级中的最高计数,而不考虑性别

数据:

打印df

   AGE GENDER rating
0   10      M     PG
1   10      M      R
2   10      M      R
3    4      F   PG13
4    4      F   PG13
代码:

 s = (df.groupby(['AGE', 'GENDER'])['rating']
       .apply(lambda x: x.value_counts().head(2))
       .rename_axis(('a','b', 'c'))
       .reset_index(level=2)['c'])
输出:

print (s[F])
('PG')

print(s[M]

('PG', 'R')

我认为您需要使用++进行分类和评级计数:

如果只想获得最高评级,请参见每组索引的第一个值:

s = df.groupby('gender')['rating'].apply(lambda x: x.value_counts().index[0])
print (s)
gender
F    PG13
M       R
Name: rating, dtype: object

print (s['M'])
R
print (s['F'])
PG13
s = df.groupby('gender')['rating'].apply(lambda x: x.value_counts().iat[0])
print (s)
gender
F    2
M    2
Name: rating, dtype: int64

print (s['M'])
2
print (s['F'])
2
或仅顶部计数选择每组系列的第一个值:

s = df.groupby('gender')['rating'].apply(lambda x: x.value_counts().index[0])
print (s)
gender
F    PG13
M       R
Name: rating, dtype: object

print (s['M'])
R
print (s['F'])
PG13
s = df.groupby('gender')['rating'].apply(lambda x: x.value_counts().iat[0])
print (s)
gender
F    2
M    2
Name: rating, dtype: int64

print (s['M'])
2
print (s['F'])
2
编辑:

编辑:

如果类型id值为字符串,则解决方案:

print (type(df.loc[0, 'genre id']))
<class 'str'>

df = df.set_index('gender')['genre id'].str.split(',', expand=True).stack()
print (df)
gender   
M       0    11
        1    22
        2    33
        0    22
        1    44
        2    55
        0    33
        1    44
        2    55
F       0    11
        1    22
        0    22
        1    55
        0    55
        1    44
dtype: object

d = df.groupby(level=0).apply(lambda x: x.value_counts().index[0]).to_dict()
print (d)
{'M': '55', 'F': '55'}

以下是此文件的标准库解决方案:

%%file "test.txt"
gender  rating
M   PG
M   R
F   NR
M   R
F   PG13
F   PG13
给定

代码

细节

解析文件的每一行并将其添加到defaultdict。键是gender,但值是每个性别的每个评级的计数器对象。调用Counter.most_common以检索顶部引用

由于数据是按性别分组的,因此您可以浏览更多信息。例如,每个性别的独特评级:

{k: set(v.elements()) for k, v in dd.items()}
# {'F': {'NR', 'PG13'}, 'M': {'PG', 'R'}}

我在这里看不到问题您的问题是什么我无法分别返回男性和女性的最高评分更新您的问题谢谢我在@espoirwhen插入此s=df.groupby'gender'['rating'].applylambda x:x.value_counts.index[0]并返回s。。。这给了我一个错误。我只需要发送性别作为我对函数的输入,它应该直接给我最频繁的评分。它只是给我两种性别的评分相同,比如F-pg13和M-PG13Hmm,可能是相同数量的top,你可以通过printf.groupby'gender'['rating']检查。值\u counts这是我的输入gen\u mpaa'F',输出是性别代码F PG13 M PG13 U PG13Jez,我想这将解决我的问题,而不是将这个10 M R M PG作为我的输出,如果有top 1和top 2,它不能返回R和PG,如果只有top1,它不能返回PG,-'R','PG如果有两个,“PG”如果只有Top1嘿,如果我有一个额外的列,比如年龄范围,它的值像“young”、“成人”,那么我希望年轻人和男性在组合中处于最顶端。必须修改此代码以处理额外的列。如果你提出一个新问题,我可以回答。我将把这个答案保持原样。。。你能看看这里吗
import collections as ct


def read_file(fname):
    with open(fname, "r") as f:
        header = next(f)
        for line in f:
            gender, rating = line.strip().split()
            yield gender, rating
filename = "test.txt"

dd = ct.defaultdict(ct.Counter)
for k, v in sorted(read_file(filename), key=lambda x: x[0]):
    dd[k][v] += 1 

{k: v.most_common(1) for k, v in dd.items()}
# {'F': [('PG13', 2)], 'M': [('R', 2)]}
{k: set(v.elements()) for k, v in dd.items()}
# {'F': {'NR', 'PG13'}, 'M': {'PG', 'R'}}