Pandas - 查找具有最小值的多指数级别之一的行

时间:2013-04-03 14:04:32

标签: python pandas dataframe

所以,我有一个带有多索引的DataFrame,如下所示:

                               info1 info2       info3
abc-8182 2012-05-08 10:00:00       1   6.0     "yeah!"
         2012-05-08 10:01:00       2  25.0        ":("
pli-9230 2012-05-08 11:00:00       1  30.0  "see yah!"    
         2012-05-08 11:15:00       1  30.0  "see yah!"    

...

索引是一个id和一个日期时间,表示记录有关该ID的信息。我们需要做的是为每个id找到最早的记录。我们从数据框方法中尝试了很多选项,但最后我们通过循环遍历DataFrame来完成它:

df = pandas.read_csv(...)
empty = pandas.DataFrame()
ids = df.index.get_level_values(0)
for id in ids:
    minDate  = df.xs(id).index.min()
    row = df.xs(id).xs(minDate)
    mindf = pandas.DataFrame(row).transpose()
    mindf.index = pandas.MultiIndex.from_tuples([(id, mindate)])
    empty = empty.append(mindf)

print empty.groupby(lambda x : x).first()

这给了我:

                                               x0  x1        x2
('abc-8182', <Timestamp: 2012-05-08 10:00:00>)  1   6     yeah!
('pli-9230', <Timestamp: 2012-05-08 11:00:00>)  1  30  see yah!

我觉得必须有一个简单的,“pandas惯用”,非常直接的方式来做到这一点,而不通过像这样的数据框循环。在那儿? :)

感谢。

1 个答案:

答案 0 :(得分:4)

要获得每组中的第一项,您可以执行以下操作:

df.reset_index(level=1).groupby(level=0).first()

会在groupby按组分组之前将datetime字段删除到列,因此它将保留在结果的数据框中。

如果您需要确保保留最早的时间,可以在致电first之前进行排序:

df.reset_index(level=1).sort_index(by="datetime").groupby(level=0).first()