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オプションの 1 つを使用して日付を解析し、最初から正しい日付にする方がよいでしょう。(あなたが 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 に答える