python 如何在 Dataframe 中获得每个类别的最高值?

enxuqcxy  于 2022-11-21  发布在  Python
关注(0)|答案(4)|浏览(235)

我有一个名为 movie_df 的 Dataframe ,它有超过3000个**标题、评分和评级的值。**标题是唯一的。评分为0.0 - 10.0。评级为PG-13、G、R或X。它们按评级排序,然后按评分升序排序。
我想按分级查找分级最高的标题。分级最高的标题没有与其他标题相同的分级。
| 职称|刻痕|额定值|
| - -|- -|- -|
| 复仇者|五点四|PG-十三级|
| 美国队长|六点七|PG-十三级|
| 铁人|八点六|PG-十三级|
| 一个人。|一个人。|一个人。|
| 蜘蛛侠|七个|右|
| 冒失鬼|第8.2条|右|
| 死池|10个|右|
预期输出:PG-13:钢铁侠,R:死池
我不想使用循环来查找评分最高的标题。
我试探着:

movie_df.sort_values(by=['rating', 'score'], inplace=True) # sort by rating, score
print(movie_df.to_string()) # to show dataframe
movie_df.groupby('rating').max()

它显示了正确的最高分,但标题是错误的。它也显示了最高标题,但我不想这样。我想知道与最高分相关的标题。
下面是我使用的实际数据及其最高评级的标题:第一个
outputRated G outputPG OutputPG-13 OutputR Output

eni9jsuy

eni9jsuy1#

让我们试试看:

movie_df.reset_index(drop=True, inplace=True)

m=max(movie_df['score'])

print(movie_df['rating'][list(movie_df['score']).index(m)])

我认为您还可以使用groupby()agg()

ajsxfq5m

ajsxfq5m2#

我认为你的数据实际上没有正确排序,这就是为什么你得到了错误的标题,但正确的分数。
尝试movie_df.groupby('rating').idxmax()并检查是否获得了正确的索引。

vsnjm48y

vsnjm48y3#

我知道了。这段代码会输出每个评分最高的标题。

movie_df["rank"] = movie_df.groupby("rating")["score"].rank("dense", ascending=False)
movie_df[movie_df["rank"]==1.0][['title','score']]

它使用Pandas的秩函数。https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.rank.html

smdncfj3

smdncfj34#

实际上,您需要的是每个评分的最高分,您可以按以下方式按最高分对每个评分进行分组:

data = [['avengers', 5.4 ,'PG-13'],
['captain america', 6.7, 'PG-13'],
['spiderman', 7,    'R'],
['daredevil', 8.2, 'R'],
['iron man', 8.6, 'PG-13'],
['deadpool', 10, 'R']]
 
df = pd.DataFrame(data, columns=['title', 'score', 'rating']) 
# Method 1 using lambda function
df = df.groupby('rating').apply(lambda x: x.sort_values('score', ascending = False).head(1))
print(df.reset_index(drop=True))

# Method 2 
df = df.sort_values('score', ascending = False).groupby('rating').head(1)
print(df.reset_index(drop=True))

输出1:

title  score rating
0  iron man    8.6  PG-13
1  deadpool   10.0      R

输出2:

title  score rating
0  deadpool   10.0      R
1  iron man    8.6  PG-13

相关问题