6

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

4

2 回答 2

5

鉴于此设置:

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]))
于 2013-10-02T20:12:31.443 回答
4

一个也可以使用

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

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

于 2018-01-07T00:32:29.193 回答