Python Pandas idxmax用于数据框中的多个索引

Ale*_*lia 4 python multi-index pandas

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

            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
Run Code Online (Sandbox Code Playgroud)

查询在哪里: df.groupby([df.index.date, 'delivery']).size()

对于每一天,我都需要拉出数量最多的送货号码。我感觉就像是这样:

df.groupby([df.index.date, 'delivery']).size().idxmax(axis=1)
Run Code Online (Sandbox Code Playgroud)

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

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

kni*_*fni 5

您的示例代码不起作用,因为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
Run Code Online (Sandbox Code Playgroud)

输出

            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
Run Code Online (Sandbox Code Playgroud)

创建自定义函数:

诀窍是使用reset_index()方法(因此您可以轻松获取组的整数索引)

def func(df):
    idx = df.reset_index()['DeliveryCount'].idxmax()
    return df['DeliveryNb'].iloc[idx]
Run Code Online (Sandbox Code Playgroud)

应用它:

g = df.groupby(df.index)
g.apply(func)
Run Code Online (Sandbox Code Playgroud)

结果:

Date
2007-04-26    706
2007-04-27    708
2007-04-28     45
dtype: int64
Run Code Online (Sandbox Code Playgroud)