如何根据另一列找到某列的前五个最大值?

3

我正在练习使用IMDB数据集,并希望找到拥有最高预算的顶级流派。

实际上,在需要制作箱线图且流派众多的情况下,这将非常有用。因此,将它们缩小到最昂贵的流派将使箱线图更清晰。

i tried this: df.sort_values(by=["genres","budget"]) 

但这并不正确。
1个回答

1

如果需要返回所有列:

我认为你需要使用 sort_values + groupby + head:

df=df.sort_values(by=["genres","budget"], ascending=[True, False]).groupby("genres").head(5)

或者nlargest
df = df.groupby('genres', group_keys=False).apply(lambda x: x.nlargest(5, "budget"))

如果只需要返回genresbudget列:
df = df.groupby('genres')["budget"].nlargest(2).reset_index(level=1, drop=True).reset_index()

示例:

df = pd.DataFrame({'A':list('abcdef'),
                   'B':[4,5,4,5,5,4],
                   'C':[7,8,9,4,2,3],
                   'budget':[1,3,5,7,1,0],
                   'E':[5,3,6,9,2,4],
                   'genres':list('aaabbb')})

print (df)
   A  B  C  E  budget genres
0  a  4  7  5       1      a
1  b  5  8  3       3      a
2  c  4  9  6       5      a
3  d  5  4  9       7      b
4  e  5  2  2       1      b
5  f  4  3  4       0      b

df1=df.sort_values(by=["genres","budget"], ascending=[True, False]).groupby("genres").head(2)

df1 = df.groupby('genres', group_keys=False).apply(lambda x: x.nlargest(2, "budget"))

print (df1)
   A  B  C  E  budget genres
2  c  4  9  6       5      a
1  b  5  8  3       3      a
3  d  5  4  9       7      b
4  e  5  2  2       1      b

df1=df.groupby('genres')["budget"].nlargest(2).reset_index(level=1, drop=True).reset_index()
print (df1)
  genres  budget
0      a       5
1      a       3
2      b       7
3      b       1

---

如果需要按类型列出每个类型的预算总和:
df = pd.DataFrame({'A':list('abcdef'),
                   'B':[4,5,4,5,5,4],
                   'C':[7,8,9,4,2,3],
                   'budget':[1,3,5,7,1,0],
                   'E':[5,3,6,9,2,4],
                   'genres':list('aabbcc')})

print (df)
   A  B  C  E  budget genres
0  a  4  7  5       1      a
1  b  5  8  3       3      a
2  c  4  9  6       5      b
3  d  5  4  9       7      b
4  e  5  2  2       1      c
5  f  4  3  4       0      c

df = df.groupby('genres')['budget'].sum().nlargest(2)
print (df)
genres
b    12
a     4
Name: budget, dtype: int64

细节:

print (df.groupby('genres')['budget'].sum())
genres
a     4
b    12
c     1
Name: budget, dtype: int64

为了排除类型并将其放入箱线图中:df.boxplot(column="budget", by=df['genres'] == "我应该放什么?????") - gsa
你想要过滤一个还是多个“genres”? - jezrael
因为只需要两行代码 - 第一行是过滤器 df = df[df['genres'].isin(['a','b'])],第二行是绘图 df.boxplot(column="budget",by='genres') - jezrael
实际上,我想包括预算最高的5个流派。 - gsa
你认为最后一个解决方案怎么样?聚合并过滤前5个流派? - jezrael
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接