我有一个大型数据框,每个键都分配了一个值。但是,我确实有一个键具有多个值的情况,这些需要通过选择最大值来解决
示例(日期+测试是关键):
df = pd.DataFrame({'date':['1/1/16','1/2/16','1/1/16','1/1/16'],'test':['A','A','B','B'],'Val':[3,4,1,4]})
grouped = df.groupby(['date','test'])
我能做到:
agg = grouped.apply(lambda x: x[x['Val'] == x['Val'].max()])
然而,df是~400K条目,只有~300个键映射到多个值。我希望通过将违规密钥与其余密钥分开并在很小的集合上运行max然后重新组合来加快这个过程。
我可以算数:
ct = grouped.count()
但是如何使用它来索引该组?
这不起作用:
grouped[ct>1]
谢谢
[更新1]
这就是我的想法。
keys = ['date','test']
ct = pd.DataFrame()
ct['Count'] = grouped.apply(lambda x: len(x))
ct.reset_index(inplace=True)
df = pd.merge(df,ct,on=keys,how='inner')
现在,我可以根据计数为1或更大的数据将数据帧拆分为两个。 仍然很乐意听到有关如何做得更好的建议。
答案 0 :(得分:0)
df['Max_Val'] = df.groupby(['date','test']).transform(lambda x: x.max() if x.size > 1 else x)
的产率:
Val date test Max_Val
0 3 1/1/16 A 3
1 4 1/2/16 A 4
2 1 1/1/16 B 4
3 4 1/1/16 B 4
这是你追求的结果吗?