所以,我有一个带有多索引的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惯用”,非常直接的方式来做到这一点,而不通过像这样的数据框循环。在那儿? :)
感谢。
答案 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()