我有一个看起来像这样的数据框:
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
很抱歉,如果我缺少一些基本知识,因为我对使用熊猫还很陌生
答案 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