0

所以,我有一个带有多索引的 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 方法中尝试了很多选项,但最终我们通过循环遍历 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!

我觉得必须有一个简单的、“熊猫惯用的”、非常直接的方法来做到这一点,而无需像这样循环数据框。有没有?:)

谢谢。

4

1 回答 1

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()
于 2013-04-03T14:25:15.967 回答