【发布时间】: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确实是我在链中遇到的最后一个错误,但如果你追溯它,你应该会看到很多“由”上面。因此我引用了那些。