这与:Finding the max value for a hierarchy level over another level
略有关系在这个问题中,我问的是如何找到给定值的最新观察结果。例如,假设我在不同城市的不同日期有一系列观察。我想对每个城市进行最近的观察。在下面的示例中,观察值是值v1,v2,v3
的元组假设我有一个这样的数据框:
city obs_dt v1 v2 v3
LA 1/1/12 13 99 89
LA 1/1/13 2 2 1
NY 1/1/11 4 2 1
NY 1/1/13 2 22 1
NY 1/9/13 3 2 1
Bo 1/9/13 2 23 1
我想要一个看起来像的结果:
city obs_dt v1 v2 v3
LA 1/1/13 2 2 1
NY 1/9/13 3 2 1
Bo 1/9/13 2 23 1
目前我正在解决这个问题:
most_recent_dates = raw_data.groupby(["city"]).max()
most_recent_dates_idxed = most_recent_dates.set_index("obs_dt", append=True)
raw_data_idxed = raw_data.set_index(["city", "obs_dt"])
newest_raw = raw_data_idxed.join(most_recent_dates_idxed, how="inner", rsuffix="_max")
newest = newest_raw.drop(labels=(x for x in newest_raw if x.endswith("_max")), axis=1)
这似乎是很多代码来实现我想要的。
以前我要找的是按照另一列的列的argmax进行索引。
obs_dt列是日期时间列。为了问题的目的,我把它看起来像一个字符串。
答案 0 :(得分:1)
这并没有完全回答indexing-using-argmax问题,但我是如何在实践中处理这个问题的。
首先,我将您的obs_dt
列转换为datetime
列,这样您就不会因字典比较而花费最多的字符串。如果您从文件中读取此文件,最好使用read_csv
选项之一解析日期,以便它们从一开始就是正确的。 (我不确定你是DD / MM / YY还是MM / DD / YY;小心。)
然后我sort
按日期groupby
关注城市,然后选择last
。它有点不那么优雅,因为你真的只需要最大值,而不是对整个列表进行排序,但除非数据确实非常大,否则我发现通常最好在开始时对它进行排序..
示例:
>>> df
city obs_dt v1 v2 v3
0 LA 1/1/12 13 99 89
1 LA 1/1/13 2 2 1
2 NY 1/1/11 4 2 1
3 NY 1/1/13 2 22 1
4 NY 1/9/13 3 2 1
5 Bo 1/9/13 2 23 1
>>> df["obs_dt"] = pd.to_datetime(df["obs_dt"])
>>> df.sort("obs_dt").groupby("city", as_index=False).last()
city obs_dt v1 v2 v3
0 Bo 2013-01-09 00:00:00 2 23 1
1 LA 2013-01-01 00:00:00 2 2 1
2 NY 2013-01-09 00:00:00 3 2 1
(如果城市秩序很重要,我们也可以保留,如果需要的话。)