熊猫:加速组合?

时间:2014-12-12 16:09:33

标签: python pandas group-by

我想知道是否可以使用以下应用程序加速pandas dataframe.groupby

基本数据结构:

  • HDFStore 9列
  • 4列是包含数据的列(colF ... colI
  • 其余5列(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可以加速,那将是万无一失的......

1 个答案:

答案 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)