我有一个看起来像这样的系列:
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