0

这与以下内容略有相关:在另一个级别上查找层次结构级别的最大值

在这个问题中,我要问如何找到给定值的最新观察结果。例如,假设我在不同的日期对不同的城市进行了一系列观察。我会对每个城市进行最近的观察。在下面的示例中,观察值是值 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 列是一个日期时间列。出于问题的目的,我使它看起来像一个字符串。

4

1 回答 1

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

(如果城市秩序很重要,如果需要,我们也可以保留它。)

于 2013-11-09T17:49:46.533 回答