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

2 投票
1 回答
2875 浏览
提问于 2025-04-17 23:45

我想为数据表中的每个组创建一行新数据,方法是复制最后一行,然后修改一些值。我的做法是这样的,但在合并的步骤上似乎速度很慢(我也试过用追加的方法)。有没有什么建议?

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 个回答

1

感谢用户1827356的帮助,我通过把操作移出apply,速度提升了100倍。之前使用first的时候,按Group列分组时出现了问题,所以我改用了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

撰写回答