如何访问多索引数据框的最后一个元素

时间:2013-10-02 19:57:18

标签: python pandas

我有一个ID和时间戳作为多索引的数据帧。数据帧中的索引按ID和时间戳排序,我想为每个ID选择最新的时间戳。例如:

IDs    timestamp     value
0      2010-10-30     1
       2010-11-30     2
1      2000-01-01     300
       2007-01-01     33
       2010-01-01     400
2      2000-01-01     11

基本上我想要的结果是

IDs    timestamp    value
0      2010-11-30   2
1      2010-01-01   400
2      2000-01-01   11

在pandas中执行此操作的命令是什么?

2 个答案:

答案 0 :(得分:4)

鉴于此设置:

import pandas as pd
import numpy as np
import io

content = io.BytesIO("""\
IDs    timestamp     value
0      2010-10-30     1
0      2010-11-30     2
1      2000-01-01     300
1      2007-01-01     33
1      2010-01-01     400
2      2000-01-01     11""")

df = pd.read_table(content, header=0, sep='\s+', parse_dates=[1])
df.set_index(['IDs', 'timestamp'], inplace=True)

使用reset_index后跟groupby

df.reset_index(['timestamp'], inplace=True)
print(df.groupby(level=0).last())

产量

              timestamp  value
IDs                           
0   2010-11-30 00:00:00      2
1   2010-01-01 00:00:00    400
2   2000-01-01 00:00:00     11

然而,这并不是最好的解决方案。应该有一种方法可以在不调用reset_index ...

的情况下执行此操作

正如您在评论中指出的那样,last会忽略NaN值。要不跳过NaN值,您可以使用groupby/agg,如下所示:

df.reset_index(['timestamp'], inplace=True)
grouped = df.groupby(level=0)
print(grouped.agg(lambda x: x.iloc[-1]))

答案 1 :(得分:0)

也可以使用

df.groupby("IDs").tail(1)

这将采用级别" ID"中每个标签的最后一行。并且不会忽略NaN值。