熊猫:如何对子类别中的前N个观测值进行子集(和求和)?

时间:2018-06-28 07:49:56

标签: python pandas

在这样的熊猫数据框中:

     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

1 个答案:

答案 0 :(得分:1)

我认为需要GroupBy.applySeries.nlargestsum

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