使用groupby和last分割Pandas Dataframe

时间:2016-05-17 03:27:33

标签: python pandas dataframe group-by

我正在使用pandas数据框,我希望按一列分组,抓取每个组的最后一行(创建一个新的数据帧),然后从原始数据集中删除这些行。

我做了大量的阅读和测试,似乎我不能像我希望的那样轻松地做到这一点。我可以做一个kludgy解决方案,但它似乎效率低下,而且,kludgy。

这是我想要做的伪代码:

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

创建last_lines数据帧很好,它会从原来的df中删除这些行,这是一个问题。问题是创建last_lines时原始索引(来自df)断开连接。我看了过滤器和转换,但似乎都没有解决这个问题。有没有一种很好的方法可以根据位置将数据框分成两部分?

我的kludge解决方案是遍历组迭代器并创建索引列表,然后删除它们。

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)

更好的建议?

2 个答案:

答案 0 :(得分:1)

如果您先使用.reset_index(),则会将索引作为列,并且可以使用.last()来获取所需的索引。

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

此处索引的访问时间为.index,因为“index”是使用reset_index时为此列指定的默认名称。如果您的索引有一个名称,那么您将使用它。

您还可以使用.apply()

“手动”抓取最后一个索引
last_lines = d.groupby('A').apply(lambda g: g.index[-1])

如果您正在使用MultiIndex,则可能必须这样做(因为在这种情况下使用.reset_index()会添加多个不能轻易组合回索引的列。)< / p>

答案 1 :(得分:0)

尝试:

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