2016-05-17 53 views
1

我正在与一个熊猫数据框在哪里我想按一列分组,抓住每个组的最后一行(创建一个新的数据框),然后从原始删除这些行。分割熊猫数据框与groupby和最后

我做了大量的阅读和测试,看起来我不能像我所希望的那样容易地做到这一点。我可以做一个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

我给了以下的答案,但我不知道你的意思拆分数据帧的内容。看起来你只是试图删除单独的行,而不是分割。 – BrenBarn

+0

可能是一个语言问题...我想结束两个数据框,其中的连接是完整的原始数据框...所以,对我来说是分裂。我是分两步做的......创造第一个很容易......这是下降的部分,我与...有问题。所以这就是为什么我专注于此。再次感谢您的答案! –

回答

1

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

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

这里的指数为.index访问,因为“指数”是当您使用reset_index给此列的默认名称。如果你的索引有一个名字,你会用它来代替。使用.reset_index()

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

你可能必须这样做,如果您使用的是多指标(这种方式,因为这样的话会:

您也可以在“手动”使用.apply()抢到最后一个索引添加多个不能轻松组合回索引的列以删除)。

+0

谢谢。我曾尝试过reset_index,但_after_之前没有。这工作像一个魅力。 –

0

尝试:

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

谢谢。这也工作。只是为了给未来的读者添加评论,这就在包含最后一行的df上创建了一个多索引,称这个new_df。然后从原始的df中删除这些行:df.drop(new_df.index.get_level_values(1))。现在,你已经有了两块原始DF,这是原来的问题。 –