我正在使用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)
更好的建议?
答案 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, :])