Python idxmax()不适用于包含NaN的SeriesGroupBy

Python idxmax()不适用于包含NaN的SeriesGroupBy,python,pandas,Python,Pandas,这是我的密码 from pandas import DataFrame, Series import pandas as pd import numpy as np income = DataFrame({'name': ['Adam', 'Bill', 'Chris', 'Dave', 'Edison', 'Frank'], 'age': [22, 24, 31, 45, 51, 55], 'income': [1

这是我的密码

from pandas import DataFrame, Series
import pandas as pd
import numpy as np
income = DataFrame({'name': ['Adam', 'Bill', 'Chris', 'Dave', 'Edison', 'Frank'],
                    'age': [22, 24, 31, 45, 51, 55],
                    'income': [1000, 2500, 1200, 1500, 1300, 1600],
                    })
ageBin = pd.cut(income.age, [20, 30, 40, 50, 60])
grouped = income.groupby([ageBin])
highestIncome = income.ix[grouped.income.idxmax()]
我有一个包含姓名、年龄和收入的数据框,如下所示:

index   age income  name
0   22  1000    Adam
1   24  2500    Bill
2   31  1200    Chris
3   45  1500    Dave
4   51  1300    Edison
5   55  1600    Frank
我想按年龄分类收集数据,并收集收入最高的记录。上述代码有效,最高代码为:

但是,如果我删除了Chris的记录,因此在30、40岁的年龄范围内没有任何记录,我会在grouped.income.idxmax处得到一个ValueError。我想这是因为NaN在分组,但我找不到解决问题的方法。欢迎您的任何意见

更新:非常感谢你的回答。我相信这是groupby对象的idxmax上的一个bug。我想使用aggrembda x:x.idxmax方法,因为我在1000万个合成数据集上测试了sort与aggrembda x:x.idxmax的使用速度。以下是代码和输出:

from pandas import DataFrame, Series
import pandas as pd
import numpy as np
import time

testData = DataFrame({'key': np.random.randn(10000000),
                      'value': np.random.randn(10000000)})
keyBin = pd.cut(testData.key, 1000)

start = time.time()
grouped1 = testData.sort('value', ascending=False).groupby([keyBin])
highestValues1 = testData.ix[grouped1.head(1).index]
end = time.time()
print end - start

start = time.time()
grouped2 = testData.groupby([keyBin])
highestValues2 = testData.ix[grouped2.value.agg(lambda x: x.idxmax())].dropna(how='all')
end = time.time()
print end - start
#validation
(highestValues1.sort() == highestValues2.sort()).all()
输出:

5.30953717232
1.0279238224

Out[47]:

key      True
value    True
dtype: bool
由于groupby保留每个组中的行顺序,所以您可以在groupby之前对收入进行排序。然后,使用head拾取第一个:

顺便说一句,请注意参考手册没有提到groupby将保留订单。我认为最干净的解决方案是修复熊猫的idxmax。对我来说,为什么idxmax不工作而max工作有点奇怪。

由于groupby保留了每个组中的行顺序,所以可以在groupby之前对收入进行排序。然后,使用head拾取第一个:


顺便说一句,请注意参考手册没有提到groupby将保留订单。我认为最干净的解决方案是修复熊猫的idxmax。对我来说,为什么idxmax不工作而max工作有点奇怪。

只需在组上应用lambda函数,如下所示:

grouped.apply(lambda x: x.max())

只需在组上应用lambda函数,如下所示:

grouped.apply(lambda x: x.max())
然后您可以执行以下操作来获取数据

income.ix[result.values].dropna()
然后您可以执行以下操作来获取数据

income.ix[result.values].dropna()

我需要得到最大值的索引,这样我仍然可以保留姓名。这应该会返回一个完整的数据框,其中包括姓名和年龄的人。如果您确实需要索引,只需创建一个复制原始索引的新列,我的代码就会将其与其他所有内容一起返回。完整的数据帧包括每列上的所有最大数据。我的例子恰好使名字按字母顺序排在后面的人有更高的收入,这使得这种方法可行。但是,如果您只是在“姓名”列中切换“Frank”和“Edison”,您可以看到结果不正确。我需要获取最大值的索引,以便仍然可以保留姓名。这将返回一个完整的数据框,其中包括人员的姓名和年龄。如果您确实需要索引,只需创建一个复制原始索引的新列,我的代码就会将其与其他所有内容一起返回。完整的数据帧包括每列上的所有最大数据。我的例子恰好使名字按字母顺序排在后面的人有更高的收入,这使得这种方法可行。但是,如果你只是在“姓名”列中切换“弗兰克”和“爱迪生”,你会发现结果不正确。谢谢你的回答。但是,sort是否需要比仅仅找到最大值更长的时间?为了测试sort与idxmax的对比,我将在groupby中生成一个没有NaN的大型合成数据集。明天我会尝试更新结果。是的,虽然我不确定结果会有多大,但需要更长的时间。排序在日志N上,查找最大值在打开状态。实际上,您的数据集太大,无法存储在内存中,这并不是什么大问题;排序数百万行需要几秒钟。谢谢您的输入。我对这两种方法做了一个小测试,并将结果发布在主帖子中。谢谢你的回答。但是,sort是否需要比仅仅找到最大值更长的时间?为了测试sort与idxmax的对比,我将在groupby中生成一个没有NaN的大型合成数据集。明天我会尝试更新结果。是的,虽然我不确定结果会有多大,但需要更长的时间。排序在日志N上,查找最大值在打开状态。实际上,您的数据集太大,无法存储在内存中,这并不是什么大问题;排序数百万行需要几秒钟。谢谢您的输入。我对这两种方法做了一个小测试,并将结果发布在主帖子中。现在的解决方法确实是使用.ambda x:x.idxmax而不是使用.idxmax。非常感谢您在github上发布它!由于这似乎是一个bug,我在这里提出了一个问题:。现在的解决方法确实是使用.ambda x:x.idxmax而不是使用.idxmax。非常感谢您在github上发布它!
income.ix[result.values].dropna()