在这样的熊猫数据框中:
year month passengers
0 1949 January 112
1 1949 February 118
2 1949 March 132
3 1949 April 129
4 1949 May 121
5 1949 June 135
.
.
.
137 1960 June 535
138 1960 July 622
139 1960 August 606
140 1960 September 508
141 1960 October 461
142 1960 November 390
143 1960 December 432
如何将每年最多乘客的3个月作为子集(并进行计算)?
可以从一个海洋数据集中复制完全相同的数据框:
import pandas as pd
import seaborn as sns
df = sns.load_dataset('flights')
df
这是我尝试过的方法:
根据this post的评论中的一个建议,我发现在为数据框重新索引后,可以使用nlargest()
来对数据框进行子集化:
df = df.set_index(['year', 'month'])
df2 = df.groupby(level=0)['passengers'].nlargest(3)
df2
输出:
year year month
1949 1949 July 148
August 148
September 136
1950 1950 July 170
August 170
但是由于某种原因,year index
被复制了,我仍然必须重新编制索引,按年份对数据框进行分组,并对结果求和。这已经开始变得凌乱,所以没有更好的方法吗?
以下是完整的内容,可轻松进行复制粘贴:
import pandas as pd
import seaborn as sns
df = sns.load_dataset('flights')
df = df.set_index(['year', 'month'])
df2 = df.groupby(level=0)['passengers'].nlargest(3)
这是所需输出的形状:
# Sum of top 3 months for each year (no index other than default pandas dataframe index)
year sum
0 1949 600 (the sum is made up)
1 1950 600
.
.
.
10 1960 600
谢谢您的任何建议!
编辑:系统信息:
Python 3.6.0
熊猫0.19.2
Windows 7
答案 0 :(得分:1)
我认为需要GroupBy.apply
,Series.nlargest
和sum
:
df = sns.load_dataset('flights')
df2 = df.groupby('year')['passengers'].apply(lambda x: x.nlargest(3).sum()).reset_index()
print (df2)
year passengers
0 1949 432
1 1950 498
2 1951 582
3 1952 690
4 1953 779
5 1954 859
6 1955 1026
7 1956 1192
8 1957 1354
9 1958 1431
10 1959 1579
11 1960 1763