使用groupby和last拆分Pandas数据帧



我正在处理一个pandas数据帧,我想按一列分组,抓住每个组的最后一行(创建一个新的数据帧),然后从原始数据帧中删除这些行。

我做了很多阅读和测试,似乎我不能像我希望的那样轻松。我可以做一个笨拙的解决方案,但它似乎效率低下,而且,嗯,笨拙。

下面是我想做的伪代码:

df = pd.DataFrame 
last_lines = df.groupby('id').last()
df.drop(last_lines.index)

创建lastlines数据帧是很好的,从原始df中删除这些行是个问题。问题是在创建lastline时,原始索引(来自df)被断开。我研究了filter和transform,但两者似乎都没有解决这个问题。有没有一种好的方法可以根据位置将数据帧拆分为两部分?

我的笨拙解决方案是迭代组迭代器,创建一个索引列表,然后删除这些索引。

grouped = df.groupby('id')
idx_to_remove = []
for _, group in grouped:
    idx_to_remove.append(group.tail(1).index[0])
df.drop(idx_to_remove)

更好的建议?

如果您首先使用.reset_index(),您将获得作为列的索引,并且您可以在其中使用.last()来获得所需的索引。

last_lines = df.reset_index().groupby('A').index.last()
df.drop(last_lines)

在这里,索引被访问为.index,因为当您使用reset_index时,"index"是该列的默认名称。如果您的索引有一个名称,您将使用该名称。

您也可以使用.apply():"手动"获取最后一个索引

last_lines = d.groupby('A').apply(lambda g: g.index[-1])

如果您使用的是MultiIndex,您可能必须这样做(因为在这种情况下,使用.reset_index()会添加多个列,这些列无法轻松组合回要删除的索引中)。

尝试:

df.groupby('A').apply(lambda x: x.iloc[:-1, :])

相关内容

最新更新