前提・実現したいこと
pythonのpandasで、DataFrameにapplymapを使って、if文の条件に当てはまった
特定のデータのみを抽出し、再データフレーム化したいと考えています。
黄色く示した「2004-06-01」を抽出できれば、成功となります。
-
[address]ごとに見て、同じ[address]内で、[ID]が変化する時期の[転入日]を抽出したい。
-
ただし、入れ替わる前の[ID]の全データの[転出日]が記載されているものにのみ、上の条件をあてはめる。
上記の条件のため、[address]:1番地の12において、[ID]:2→5に変わっていても、3行目のデータに[転出日]の時系列データがないため、条件は適用されない。
一方、[address]:1番地の22において、[ID]:15→17に変化するとき、[ID]:15のデータは2行とも、**[転出日]**にデータの記載があるため、条件に対応している。
発生している問題・エラーメッセージ
File "<ipython-input-12-721dee1cf7f2>", line 7 elif ID[x] != ID[x+1]: ^ SyntaxError: invalid syntax
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-13-5120cab60d0b> in <module> ----> 1 df2.groupby('address').applymap(roop) ~\anaconda3\lib\site-packages\pandas\core\groupby\groupby.py in __getattr__(self, attr) 701 return self[attr] 702 --> 703 raise AttributeError( 704 f"'{type(self).__name__}' object has no attribute '{attr}'" 705 ) AttributeError: 'DataFrameGroupBy' object has no attribute 'applymap'
該当のソースコード
df2 = pd.DataFrame([[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'], [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']], columns = ['ID','転入日','転出日','address']) df2
def roop(x): for j in length[ID]: if 転出日[x] == Nan: if ID[x] == ID[x+1]: #何もしない elif ID[x] != ID[x+1]: print(転入日[x+1]) else:
df2.groupby('address').applymap(roop)
試したこと
DataFrameにif文による条件を適用させるためにapplymapメソッドを、
addressごとにデータをまとめて条件をかけたかったのでgroupbyメソッドを使用しました。
特にやり方、方法等にこだわりはありません。
applymapやifを使わなければいけないなど、過程に制限はないので、
いろんなメソッドを試して、解決策をご教示いただければ幸いです。
前回の質問が煩雑すぎたので分割して投稿させていただきました。
何か不明なところがありましたら、コメントいただければ幸いです。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー