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

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

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

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

pandas

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

Q&A

0回答

555閲覧

Pandasのデータフレームから条件にあったものだけ抽出する

takkucook

総合スコア5

Python

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

pandas

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

0グッド

0クリップ

投稿2021/06/24 10:23

編集2021/06/24 10:24

前提・実現したいこと

Pandasで、データフレームに対して、条件にあったデータを抽出しリスト化したいです。
前回質問した内容に似ているのですが、条件が異なるので、どのように条件をコード化するか教えていただきたいです。

###実現したいこと
黄色マーカーで引いたように、条件に合った「転入日」のデータを抽出したいです。
ー以下条件ー
0. 同じaddress内において、IDが異なった時の「転入日」を抽出する。

  1. 赤く囲ってあるように、同じaddressにおいて、IDが変化していても、変化する前のIDの全てのデータ(4~6行目)において、

転出日」の記載がない場合、「転入日」を抽出しない

  1. 2つ目の赤で囲ってあるように、変化する前のIDの全てのデータ(13~15行目)に、「転出日」の記載があっても、

ID変化前のデータの転出日よりもID変化後のデータの転入日の方が早い場合、転入日を抽出しない。
(「15行目転出日1998-11-01」よりも「16行目転入日1660-06-01」のほうが早い)

例1)address:1番地の12
IDが2→5に変わっても、ID:2のデータに転出日が記載されていないもの(6行目)があるので、転入日は抽出しない

例2)address:1番地の22
0. IDが13→15に変わっても、「ID:13の転出日>ID:15の転入日」であるため、転入日は抽出しない。
0. 一方で、ID15→17の変化では、「ID:15の転出日<ID:17の転入日」であるため、「転入日:2004-06-01」を抽出する。
イメージ説明

###完成イメージ
上のデータフレームでは、黄色マーカーを引いた、
「2004-06-01, 1990-01-01, 1995-04-01, 2000-05-01」を抽出できれば成功です。

抽出すべき条件、除去すべき条件にあった「転入日」を抽出しています。

意図していること・やる目的

ある番地において、居住者の変化を時系列的に捉えることが目的です。
IDとは家族を表す記号のようなもので、addressは住所みたいなものです。

つまり、1つの住所において、もともと住んでいた家族が完全に転出し、新たな家族が転入してきた日を抽出すること
意図していることになります。

そのため、IDが変化していても、完全に転出しきっていない場合(ID:2→5への変化)や、
最初に2世帯以上居住している場合(ID:13→15への変化)は、ID変化を抽出するうえで除去しておきたいものとなっています。
(実際に居住している家族が変化しているわけではないため)

該当のソースコード

実際はもっと量の多いデータになっているのですが、ここでは簡単なデータフレームを作成しました。

df = pd.DataFrame([[1,'1990-04-01', '2009-11-01', '1番地の11'], [1,'1990-04-01', '2009-11-01', '1番地の11'], [1,'1990-04-01', '2009-11-01', '1番地の11'], [1,'1990-04-01','', '1番地の11'], [2,'1990-06-01', '1997-11-01', '1番地の12'], [2,'1990-06-01', '1995-11-01', '1番地の12'], [2,'1990-06-01','', '1番地の12'], [5,'1998-07-01', '', '1番地の12'], [5,'1998-07-01', '', '1番地の12'], [5,'1998-07-01', '', '1番地の12'], [8,'2000-08-01', '', '1番地の18'], [8,'2000-08-01', '', '1番地の18'], [8,'2000-08-01', '', '1番地の18'], [13,'1990-06-01', '1995-11-01', '1番地の22'], [13,'1990-06-01', '1995-11-01', '1番地の22'], [13,'1993-06-01', '1998-11-01', '1番地の22'], [15,'1990-06-01', '2003-11-01', '1番地の22'], [15,'1990-06-01', '2003-11-01', '1番地の22'], [17,'2004-06-01', '', '1番地の22'], [17,'2004-06-01', '', '1番地の22'], [17,'2005-06-01', '2020-11-01', '1番地の22'], [19,'1986-09-01', '1988-10-01', '1番地の25'], [19,'1986-09-01', '1988-10-01', '1番地の25'], [30,'1990-01-01', '1992-11-01', '1番地の25'], [30,'1990-01-01', '1992-11-01', '1番地の25'], [45,'1995-04-01', '1998-03-01', '1番地の25'], [45,'1995-04-01', '1998-03-01', '1番地の25'], [60,'2000-05-01', '', '1番地の25']], columns = ['ID','転入日','転出日','address']) df

試したこと

ひとつ前の質問で回答していただいた方法に自分なりに条件を加えようロしたのですが、うまく回りませんでした。
よろしくお願いします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問