🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

14507閲覧

DFの中の場所それぞれの最新の日付を取得したい。

occur

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2019/09/17 04:23

例えば、県の地域ごとに、

県名Areadatatime
北海道北海道-A2019-05-01
北海道北海道-B2019-04-28
新潟新潟-A2019-05-01
新潟新潟-A2019-05-03
新潟新潟-C2019-05-01
島根島根-A2019-05-03
島根島根-B2019-05-03
島根島根-B2019-05-01

というようなデータがあるとして、
それぞれの地域の最新のdatetimeを撮りたい時のループ処理がうまく書けません。

試したこととしては、

Arealis = df['Area'].unique for i in Arealis: tmp1 = df.loc[df['Area']== i, ].reset_index().sort_values('datetime', ascending=False).head(1)

これでtmp1を表示すると島根-Bの最新の日付の行のみ表示されます。
北海道-A,北海道-B,新潟-A・・・それぞれのエリアの最新の日付がある行をとって一つのデータフレームか、Areaとdatetimeのリストにしたいのですがうまく書けません、、助言お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

手順

以下の手順で実現できます。

  1. sort_values("datatime") で列 datatime を日付が古い順でソートする。
  2. groupby("Area") で列 "Area" の値でグループ化する。
  3. tail(1) で各グループの末尾 (一番新しい日付) を取得する。

コード

csv

1県名,Area,datatime 2北海道,北海道-A,2019-05-01 3北海道,北海道-B,2019-04-28 4新潟,新潟-A,2019-05-01 5新潟,新潟-A,2019-05-03 6新潟,新潟-C,2019-05-01 7島根,島根-A,2019-05-03 8島根,島根-B,2019-05-03 9島根,島根-B,2019-05-01

python

1import pandas as pd 2 3df = pd.read_csv("sample.csv", parse_dates=["datatime"]) 4 5latest_date = df.sort_values("datatime").groupby("Area").tail(1) 6print(latest_date) 7# 県名 Area datatime 8# 1 北海道 北海道-B 2019-04-28 9# 0 北海道 北海道-A 2019-05-01 10# 4 新潟 新潟-C 2019-05-01 11# 3 新潟 新潟-A 2019-05-03 12# 5 島根 島根-A 2019-05-03 13# 6 島根 島根-B 2019-05-03

投稿2019/09/17 04:37

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Python

1df.groupby('Area')['datetime'].max()

のように、DataFrame.groupby('Area')にてArea 列の値でグループ化しpyth、datetime 列の最大値(max())を求めるとよいのではないでしょうか。

以下動作サンプル

Python

1import pandas as pd 2import io 3 4data = """ 5県名,Area,datetime 6北海道,北海道-A,2019-05-01 7北海道,北海道-B,2019-04-28 8新潟,新潟-A,2019-05-01 9新潟,新潟-A,2019-05-03 10新潟,新潟-C,2019-05-01 11島根,島根-A,2019-05-03 12島根,島根-B,2019-05-03 13島根,島根-B,2019-05-01 14""" 15 16df = pd.read_csv(io.StringIO(data), parse_dates=['datetime']) 17 18ret = df.groupby('Area')['datetime'].max() 19#Area 20#北海道-A 2019-05-01 21#北海道-B 2019-04-28 22#島根-A 2019-05-03 23#島根-B 2019-05-03 24#新潟-A 2019-05-03 25#新潟-C 2019-05-01 26#Name: datetime, dtype: datetime64[ns] 27 28#元のDataFrameに結合したいのであれば ``transport()`` を使って以下のようにする 29df['last'] = df.groupby('Area')['datetime'].transform('max') 30# 県名 Area datetime last 31#0 北海道 北海道-A 2019-05-01 2019-05-01 32#1 北海道 北海道-B 2019-04-28 2019-04-28 33#2 新潟 新潟-A 2019-05-01 2019-05-03 34#3 新潟 新潟-A 2019-05-03 2019-05-03 35#4 新潟 新潟-C 2019-05-01 2019-05-01 36#5 島根 島根-A 2019-05-03 2019-05-03 37#6 島根 島根-B 2019-05-03 2019-05-03 38#7 島根 島根-B 2019-05-01 2019-05-03 39

投稿2019/09/17 06:28

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問