我想知道是否可以使用以下应用程序加速pandas dataframe.groupby
:
基本数据结构:
colF
... colI
)colA
... colE
)的组合提供了唯一索引colE
是“最后修改过的”列基本思想是使用“事务内存”实现数据库。假设一个条目发生了变化,我不会删除它,而是在“last modified”列中写一个带有新值的新行。这使我能够追溯查看条目随时间的变化情况。
但是,在我只想要数据的当前有效“状态”的情况下,它只需要选择那些具有最新“最后修改”列的行:
idx = df.groupby(['colA', 'colB', 'colC', 'colD'],
as_index=False, sort=False)['colE'].max()
df_current_state = df.merge(idx, 'inner', on=['colA', 'colB', 'colC', 'colD', 'colE'])
此groupby
方法占用了我运行时间的70%左右。
注意:对于大多数行,“最后修改”列只存在一个条目。仅存在极少数情况,存在具有不同“最后修改”值的行的多个版本。
除了如下更改程序逻辑外,还有办法加快此过程吗?
groupby
:添加一个额外的“布尔”列activeState
,用于存储该行是否属于“活动状态”。
当行更改时,将其activeState
字段标记为False
,然后使用activeState=True
插入新行。
然后,可以使用activeState==True
查询该表,而不是使用groupby
。
我对此解决方案的问题是,如果activeState
字段设置不当,它可能会出错。当然,这可以通过使用“最后修改”列来恢复,但如果groupby
可以加速,那将是万无一失的......
答案 0 :(得分:1)
使用排序后跟drop_duplicates怎么样?我在一个大型数据库上使用它,有四个级别的分组,速度很快。我拿第一个,所以我不知道第一个和最后一个如何帮助速度,但你也可以总是扭转这种排序。
df_current_state = df.sort(columns='colE')
df_current_state = df_current_state.drop_duplicates(subset=['colA','colB','colC','colD'],take_last=True)