在pandas中为groupby添加额外行的最快方法

时间:2014-03-25 00:53:03

标签: python performance pandas

我试图通过复制最后一行然后修改某些值来为数据框中的每个组创建一个新行。我的方法如下,concat步骤似乎是瓶颈(我也尝试追加)。有什么建议吗?

def genNewObs(df):
    lastRowIndex = df.obsNumber.idxmax()
    row = pd.DataFrame(df.ix[lastRowIndex].copy())
    # changes some other values in row here
    df = pd.concat([df,row], ignore_index=True)
    return df

df = df.groupby(GROUP).apply(genNewObs)

编辑1:基本上我有一堆数据,其中包含不同日期的最后一次观察。我想在当前日期为所有组创建最终观察结果。

Group   Date       Days Since last Observation
  A    1/1/2014               0
  A    1/10/2014              9
  B    1/5/2014               0
  B    1/25/2014              20
  B    1/27/2014              2

如果我们假装当前日期是2014年1月31日,则变为:

Group   Date       Days Since last Observation
  A    1/1/2014               0
  A    1/10/2014              9
  A    1/31/2014              21
  B    1/5/2014               0
  B    1/25/2014              20
  B    1/27/2014              2
  B    1/31/2014              4

我尝试过放大设置,这是所有技巧中最慢的。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

感谢用户1827356,我通过取消应用操作将其加速了100倍。出于某种原因,首先是按组列删除,所以我使用了idxmax。

def genNewObs(df):
    lastRowIndex = df.groupby(Group).Date.idxmax()
    rows = df.ix[lastRowIndex]
    df = pd.concat([df,rows], ignore_index=True)
    df = df.sort([Group, Date], ascending=True)
    return df