我刚刚开始学习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名,排序不会很慢吗?有没有更有效的方法?
发布于 2018-03-29 18:16:21
我认为需要:
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
head
index
TotalCarSales
详细信息
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发布于 2018-03-29 18:18:21
当你在学习的时候,最好的方法就是去尝试。
您的数据不太可能太大(没有数百万个汽车型号),但在任何情况下,您都可以使用df.head(N)获取前N行来尝试您的方法,看看它是否很慢。
其他有用的函数包括df.groupby、df.nlargest、df.sort_values
发布于 2018-03-29 18:37:40
我要在这里做一个排序吗?那会很慢吗?
是的,在每个组中进行排序是获得所需内容的好方法。此外,排序是一个O(nlogn)操作,所以它不应该太慢。
有没有一种不用遍历DataFrame中的所有记录就能做到这一点的方法?获取前3名的最佳方法是什么?
可以,您可以使用GroupBy.head。另一种可以节省您一些时间的选择是SeriesGroupBy.nlargest,它为您提供了一个序列中最大的n个元素,这样您就不需要首先进行排序了。
https://stackoverflow.com/questions/49553357
复制相似问题