通过另一列上的列的Argmax索引DataFrame

时间:2013-11-09 17:23:40

标签: python pandas

这与: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列是日期时间列。为了问题的目的,我把它看起来像一个字符串。

1 个答案:

答案 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

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