前提・実現したいこと
Pandasで、データフレームに対して、条件にあったデータを抽出しリスト化したいです。
前回質問した内容に似ているのですが、条件が異なるので、どのように条件をコード化するか教えていただきたいです。
###実現したいこと
黄色マーカーで引いたように、条件に合った「転入日」のデータを抽出したいです。
ー以下条件ー
0. 同じaddress内において、IDが異なった時の「転入日」を抽出する。
- 赤く囲ってあるように、同じaddressにおいて、IDが変化していても、変化する前のIDの全てのデータ(4~6行目)において、
「転出日」の記載がない場合、「転入日」を抽出しない。
- 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
試したこと
ひとつ前の質問で回答していただいた方法に自分なりに条件を加えようロしたのですが、うまく回りませんでした。
よろしくお願いします。
あなたの回答
tips
プレビュー