我有一个看起来像这样的系列:

            delivery
2007-04-26  706           23
2007-04-27  705           10
            706         1089
            708           83
            710           13
            712           51
            802            4
            806            1
            812            3
2007-04-29  706           39
            708            4
            712            1
2007-04-30  705            3
            706         1016
            707            2
...
2014-11-04  1412          53
            1501           1
            1502           1
            1512           1
2014-11-05  1411          47
            1412        1334
            1501          40
            1502         433
            1504         126
            1506         100
            1508           7
            1510           6
            1512          51
            1604           1
            1612           5
Length: 26255, dtype: int64

查询在哪里:df.groupby([df.index.date, 'delivery']).size()
对于每一天,我需要拿出最大数量的送货号码。我感觉就像是这样:
df.groupby([df.index.date, 'delivery']).size().idxmax(axis=1)

但是,这只是返回整个数据帧的idxmax。相反,我需要每天的第二级idmax(而不是日期,而是交货号),而不是整个数据框(即,它返回一个向量)。

关于如何做到这一点的任何想法?

最佳答案

您的示例代码不起作用,因为idxmax是在groupby操作之后执行的(因此在整个数据帧上)

我不确定如何在多级索引上使用idxmax,所以这是一个简单的解决方法。

设置数据:

import pandas as pd
d= {'Date': ['2007-04-26', '2007-04-27', '2007-04-27', '2007-04-27',
             '2007-04-27', '2007-04-28', '2007-04-28'],
        'DeliveryNb': [706, 705, 708, 450, 283, 45, 89],
        'DeliveryCount': [23, 10, 1089, 82, 34, 100, 11]}

df = pd.DataFrame.from_dict(d, orient='columns').set_index('Date')
print df

输出
            DeliveryCount  DeliveryNb
Date
2007-04-26             23         706
2007-04-27             10         705
2007-04-27           1089         708
2007-04-27             82         450
2007-04-27             34         283
2007-04-28            100          45
2007-04-28             11          89

创建自定义函数:

诀窍是使用reset_index()方法(这样您就可以轻松获取组的整数索引)
def func(df):
    idx = df.reset_index()['DeliveryCount'].idxmax()
    return df['DeliveryNb'].iloc[idx]

应用它:
g = df.groupby(df.index)
g.apply(func)

结果 :
Date
2007-04-26    706
2007-04-27    708
2007-04-28     45
dtype: int64

10-07 13:30
查看更多