質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python

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

pandas

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

Q&A

解決済

3回答

1400閲覧

Pandasで複数条件にマッチする抽出方法について

kokomi

総合スコア2

Python

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

pandas

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

0グッド

0クリップ

投稿2021/05/30 01:12

csv

1ID,Area,datatime 21,関東,2021-04-01 31,関東,2021-02-12 41,東北,2020-12-11 51,中部,2020-08-12 62,東北,2021-05-21 72,東北,2019-02-16 82,九州,2019-02-15 93,九州,2021-04-10 103,東北,2020-12-12 113,関東,2019-11-12

上記のようなデータに対して下記条件でpandasで抽出する方法についてご教示いただけないでしょうか。
「同じIDでグルーピングし、その中で最も新しい日付に該当するAreaの中で古い日付の行を抽出」

例えば、上記sampleですと、

csv

11,関東,2021-02-12 22,東北,2019-02-16 33,九州,2021-04-10

になるかと存じます。
恐れ入りますが、ご教示のほどよろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

ちょっとごちゃごちゃしますが、以下です。

python

1>>> print(df) 2 ID Area datatime 30 1 関東 2021-04-01 41 1 関東 2021-02-12 52 1 東北 2020-12-11 63 1 中部 2020-08-12 74 2 東北 2021-05-21 85 2 東北 2019-02-16 96 2 九州 2019-02-15 107 3 九州 2021-04-10 118 3 東北 2020-12-12 129 3 関東 2019-11-12 13>>> result_df = pd.concat([subdf.loc[subdf[subdf['Area']==subdf['Area'][subdf['datatime'].idxmax()]]['datatime'].idxmin()] for _,subdf in df.groupby('ID')], axis=1).T 14>>> print(result_df) 15 ID Area datatime 161 1 関東 2021-02-12 175 2 東北 2019-02-16 187 3 九州 2021-04-10

投稿2021/05/30 01:50

ppaul

総合スコア24666

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

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

kokomi

2021/05/30 06:08

ありがとうございます! 頂いた内容で抽出できました。 内容を確認して理解するように致します。
guest

0

  • ID毎に最新日付を持つAreaを特定
  • ID,Area毎の最古日付を持つ行を取得

と段階に分けて処理する例です。

Python

1import pandas as pd 2from io import StringIO 3 4s = """ 5ID,Area,datatime 61,関東,2021-04-01 71,関東,2021-02-12 81,東北,2020-12-11 91,中部,2020-08-12 102,東北,2021-05-21 112,東北,2019-02-16 122,九州,2019-02-15 133,九州,2021-04-10 143,東北,2020-12-12 153,関東,2019-11-12""" 16 17df = pd.read_csv(StringIO(s), parse_dates=['datatime']) 18 19# 日付の降順にソート 20df = df.sort_values(['ID','datatime'], ascending=[True, False]) 21# ID毎に日付が最新であるAreaを取得 22dfg = df.groupby('ID').first().reset_index()[['ID','Area']] 23print(dfg) 24# ID Area 25#0 1 関東 26#1 2 東北 27#2 3 九州 28 29# ID毎に日付が最新であるAreaのみを抽出 30dfm = pd.merge(df,dfg, on=['ID','Area']) 31print(dfm) 32# ID Area datatime 33#0 1 関東 2021-04-01 34#1 1 関東 2021-02-12 35#2 2 東北 2021-05-21 36#3 2 東北 2019-02-16 37#4 3 九州 2021-04-10 38 39# ID,Area毎に日付が古い行を取得 40ret = dfm.groupby(['ID','Area']).last().reset_index() 41print(ret) 42# ID Area datatime 43#0 1 関東 2021-02-12 44#1 2 東北 2019-02-16 45#2 3 九州 2021-04-10

投稿2021/05/30 01:52

can110

総合スコア38278

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

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

0

大変申し訳ございませんが
質問内容読み誤っていたため、再掲しこちらの回答のほうは削除リクエストをお出ししております。

投稿2021/05/30 01:31

編集2021/05/30 02:03
m2l

総合スコア318

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

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

kokomi

2021/05/30 05:17

お手数をおかけして申し訳ないです。 こちらありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問