熊猫数据框中的聚合排序功能

时间:2019-04-03 16:34:31

标签: python pandas

我有一个看起来像这样的数据框:

    ID     Time                Quantity   Type
    1     2019-04-03 05:51:54        0    Dog|Cat
    2     2019-05-03 05:51:54        0    Dog
    3     2019-04-02 05:51:54        0    Pig|Cat
    4     2019-04-03 05:51:54        2    
    4     2019-07-03 04:51:54        0    Dog|Cat|Pig
    3     2019-04-09 05:51:54        4    

还有一种对类型列进行排序的命令:

    dictionary = {'Cat': 1,'Dog': 2,'Pig': 3}

我想按ID对表进行分组,并获取其他3列的最大值。我用它来分组前两个:

    df.groupby(['ID']).agg({'Time':'max','Quantity':'max'})

我遇到的麻烦是集成其他代码以将字典中的最大值获取到聚合函数中。我认为应该是这样的:

    max(df['Type'].str.split(pat='|'), key=lambda s: dictionary[s])

我的想法输出是:

    ID     Time                Quantity   Type
    1     2019-04-03 05:51:54        0    Dog
    2     2019-05-03 05:51:54        0    Dog
    3     2019-04-09 05:51:54        4    Pig
    4     2019-07-03 04:51:54        2    Pig

很抱歉,如果我缺少一些基本知识,因为我对使用熊猫还很陌生

2 个答案:

答案 0 :(得分:2)

使用agg的自定义函数来计算每个ID的最大值,然后进行反向查找:

d = {'Cat': 1, 'Dog': 2, 'Pig': 3}
rd = {v:k for k, v in d.items()} # reverse lookup dict

def f(z):
    return rd.get(max([d.get(y,-1)
                   for x in z.fillna('').str.split('|').values.tolist()
                   for y in x]), '')

df.groupby(['ID']).agg({'Time':'max', 'Quantity':'max', 'Type': f})

输出:

                   Time  Quantity Type
ID                                    
1   2019-04-03 05:51:54         0  Dog
2   2019-05-03 05:51:54         0  Dog
3   2019-04-09 05:51:54         4  Pig
4   2019-07-03 04:51:54         2  Pig

答案 1 :(得分:0)

这更像是unnest问题,然后在认识到我们只需要category即可达到预期输出后便成为groupby.agg问题

df.Type=df.Type.str.split('|')
s1=unnesting(df.dropna(),['Type'])
s1.Type=pd.Categorical(s1.Type,['Cat','Dog','Pig'],ordered=True)
s=s1.groupby(['ID']).Type.max()
o=df.groupby(['ID']).agg({'Time':'max','Quantity':'max'})
yourdf=pd.concat([s,o],axis=1)
yourdf
Out[371]: 
   Type                Time  Quantity
ID                                   
1   Dog 2019-04-03 05:51:54         0
2   Dog 2019-05-03 05:51:54         0
3   Pig 2019-04-09 05:51:54         4
4   Pig 2019-07-03 04:51:54         2