【问题标题】:Pandas: How to subset (and sum) top N observations within subcategories?Pandas:如何对子类别中的前 N ​​个观察值进行子集化(和求和)?
【发布时间】:2018-12-07 05:13:12
【问题描述】:

在这样的熊猫数据框中:

     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 个月进行细分(并计算)?

可以从 seaborn 数据集中复制完全相同的数据帧:

import pandas as pd
import seaborn as sns

df = sns.load_dataset('flights')
df

这是我尝试过的:

根据this post 的 cmets 中的建议,我发现在重新索引数据帧后,我可以使用 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

【问题讨论】:

  • 这很有趣:我复制了你的代码,但我得到了一个很长的异常链,主要是 TypeError: nlargest() got an unexpected keyword argument 'axis',与 ValueError: Duplicated level name: "year", assigned to level 1, is already used for level 0. 交织在一起。 Pandas 0.23.1 版,Seaborn 0.8.1 版。
  • 对我来说,您的解决方案返回 ValueError,可能是因为另一个 seaborn vesrion(在 pandas 0.23.1 中)
  • 我在 pandas 0.19.2
  • @jezrael 在使用 Python 2 时,您会看到一个简单的 ValueError。Python 3 具有链式回溯。
  • @jezrael ValueError 确实是我在链中遇到的最后一个错误,但如果你追溯它,你应该会看到很多“由”上面。因此我引用了那些。

标签: python pandas


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多