我有一个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中执行此操作的命令是什么?
答案 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
值。