首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Pandas DataFrames排序、求和和获取Max数据

问Python Pandas DataFrames排序、求和和获取Max数据
EN

Stack Overflow用户
提问于 2018-03-29 18:09:20
回答 3查看 78关注 0票数 1

我刚刚开始学习Python、Pandas和NumPy,我想找出解决以下问题的最干净、最有效的方法。

我有包含CarManufacturer、Car、TotalCarSales的数据,请记住这些数据并不小:

CarManufacturer Car TotalCarSales

大众Polo 100

大众高尔夫50

本田爵士40

本田思域100

问:根据最畅销的前三名,哪个制造商卖出了最多的汽车?

我正在努力有效地解决这个问题。我希望避免对数据进行迭代。

我的想法是:-将数据加载到DataFrame中-根据CarManufacturer、Car、TotalCarSales索引数据-我需要在这里进行排序吗?这会很慢吗?-创建一个包含CarManufacturer,TotalSales的新DataFrame。对于每个CarManufacturer,我需要获取前3个TotalCarSales并求它们的和-有没有一种方法可以在不迭代DataFrame中的所有记录的情况下做到这一点?获取前3名的最好方法是什么?-那么如果我对TotalSales排序,然后取前3名,排序不会很慢吗?有没有更有效的方法?

EN

回答 3

Stack Overflow用户

发布于 2018-03-29 18:16:21

我认为需要:

代码语言:javascript
复制
print (df)
   CarManufacturer      Car  TotalCarSales
0       Volkswagen     Polo            100
1       Volkswagen   Sharan            100
2       Volkswagen     Golf             50
3           Toyota    Auris            200
4           Toyota     Aygo             10
5           Toyota  Avensis             50
6            Honda    Civic             40
7            Honda     Jazz             40
8            Honda    Civic            100
9             Seat   Toledo            200
10            Seat     Leon            400

a = (df.sort_values('TotalCarSales', ascending=False)
      .groupby('CarManufacturer')['TotalCarSales']
      .apply(lambda x: x.head(2).sum())  #for top3 change 2 to 3
      .nlargest(3).index.tolist())
print (a)
['Seat', 'Toyota', 'Volkswagen']

解释:

首先使用sort_values

  • Then列对列进行排序,并对head

  • For选择的前3个顶值求和。3 index

TotalCarSales

  • DataFrame TotalCarSales groupby CarManufacturer nlargest and exctract of index

详细信息

代码语言:javascript
复制
print (df.sort_values('TotalCarSales', ascending=False))
   CarManufacturer      Car  TotalCarSales
10            Seat     Leon            400
3           Toyota    Auris            200
9             Seat   Toledo            200
0       Volkswagen     Polo            100
1       Volkswagen   Sharan            100
8            Honda    Civic            100
2       Volkswagen     Golf             50
5           Toyota  Avensis             50
6            Honda    Civic             40
7            Honda     Jazz             40
4           Toyota     Aygo             10

print (df.sort_values('TotalCarSales', ascending=False)
      .groupby('CarManufacturer')['TotalCarSales']
      .apply(lambda x: x.head(2).sum()))
CarManufacturer
Honda         140
Seat          600
Toyota        250
Volkswagen    200
Name: TotalCarSales, dtype: int64
票数 0
EN

Stack Overflow用户

发布于 2018-03-29 18:18:21

当你在学习的时候,最好的方法就是去尝试。

您的数据不太可能太大(没有数百万个汽车型号),但在任何情况下,您都可以使用df.head(N)获取前N行来尝试您的方法,看看它是否很慢。

其他有用的函数包括df.groupby、df.nlargest、df.sort_values

票数 0
EN

Stack Overflow用户

发布于 2018-03-29 18:37:40

我要在这里做一个排序吗?那会很慢吗?

是的,在每个组中进行排序是获得所需内容的好方法。此外,排序是一个O(nlogn)操作,所以它不应该太慢。

有没有一种不用遍历DataFrame中的所有记录就能做到这一点的方法?获取前3名的最佳方法是什么?

可以,您可以使用GroupBy.head。另一种可以节省您一些时间的选择是SeriesGroupBy.nlargest,它为您提供了一个序列中最大的n个元素,这样您就不需要首先进行排序了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49553357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档