首页 > 解决方案 > 如何过滤 Pandas 数据框以显示顶级类别的行?

问题描述

我有一个movies包含数千个电影数据的数据框,它基本上看起来像这样:

|   | MovieTitle        | Genre     |   Studio             |
------------------------------------------------------------
| 0 | Tomorrowland      | action    | Buena Vista Studios  |
| 1 | White House Down  | action    | Sony                 |
| 2 | Doctor Dolittle   | adventure | Fox                  |

我正在尝试过滤数据框以显示制作 10 部电影或更多电影的工作室的电影。我尝试使用以下代码获得顶级工作室:

top10 = (movies.groupby('Studio').size() > 10)

以上正确返回了一系列工作室和一个布尔值,指示他们是否有 10 多部电影,如下所示:

| Studio               |       |
--------------------------------
| Art House Studios    | False |
| Buena Vista Studios  | True  |
| DreamWorks           | True  |
| Lionsgate            | False |

因此,我想检索具有True上述系列的工作室,以使用它们对数据框进行子集moviesisin()

top10 = top10[top10 == True].axes
print(top10)

上面的打印命令输出如下内容:

Index(['Buena Vista Studios', 'WB', 'Fox', 'Universal', 'Sony',
   'Paramount Pictures', 'New Line Cinema', 'Pacific Data/DreamWorks',
   'DreamWorks', 'MiraMax'],
   dtype='object', name='Studio')

最后,我想使用上面的列表来过滤movies数据框:

movies[movies['Studio'].isin(top10)]

这会导致一个空的 dataframe。但是,像这样直接使用输出列表:

movies[movies['Studio'].isin(['Buena Vista Studios', 'WB', 'Fox', 'Universal', 'Sony',
   'Paramount Pictures', 'New Line Cinema', 'Pacific Data/DreamWorks',
   'DreamWorks', 'MiraMax'])]

确实返回正确的过滤数据帧。所以top10它的行为不像一个列表,尽管type(top10)它确实表明它是一个列表。

我在这里做错了什么?有没有一种更简单的方法来过滤数据框以显示制作了 10 部电影或更多电影的工作室的电影?

标签: pythonpandasdataframepandas-groupby

解决方案


将代码更改top10 = top10[top10 == True].axestop10 = top10.index[top10 == True]将解决问题而无需更改任何其他内容。

希望能帮助到你。


推荐阅读