質問: ### 前提・実現したいこと 別のデータフレームから条件に合う行を検索し、該当する場合に特定の値を抽出したいです。 インプット <データフレーム1> index 局コード 日付 time 番組コード 1 1 4/1 1132 N/A 2 3 4/3 1135 N/A 3 3 4/4 1221 N/A <データフレーム2> index 局コード 日付 開始時間 終了時間 番組コード 1 1 4/1 1130 1255 ABC1 2 2 4/1 1130 1256 BBC2 3 3 4/3 1045 1150 CBC3 4 1 4/5 930 955 AAA1 期待する結果 <データフレーム1> index 局コード 日付 time 番組コード 1 1 4/1 1132 ABC1 2 3 4/3 1135 CBC3 3 3 4/4 1221 N/A 条件としては、双方の'局コード','日付'が一致し、且つデータフレーム1の'time'が データフレーム2の'開始時間'と'終了時間'の間の値であったときのみ、番組コードを抽出し、データフレーム1の番組コードに代入する。というものを書きたいです。 pythonをはじめたばかりで、書籍で学習しながらも学業の一環でこのような高度な条件設定の記述を用意せねばならず四苦八苦しています。お力添えいただければと思い質問させていただきました。 ### 発生している問題・エラーメッセージ ``` エラーメッセージ ``` ### 該当のソースコード import pandas as pd mask =(pd.concat([データフレーム1,データフレーム2]).duplicated(subset=['局コード','放送日'], keep=False)) mask ``` python3, jupyter ``` ### 試したこと 局コードと放送日が一致する条件の時、concatで結合するという条件まではかけたのですが、timeと開始時間、終了時間の不等号による条件設定ができません。また、現状のconcatではindexが同じ番号のもののみを比較し、trueかfalseかを判別してしまっているのですが、データフレーム1のindex1の条件に該当する行をデータフレーム2全体からサーチし、index最終段まで同様の施行を繰り返すということを実現させたいです。どうかお力添えをお願いいたします。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答: とりあえずループでの処理で良ければ、以下のように複数の条件文を連ねることで実現できます。 ``` import pandas as pd import numpy as np df1 = pd.DataFrame({ '局コード':[1,3,3], '日付':['4/1','4/3','4/4'], 'time':[1132,1135,1221], '番組コード':[np.nan,np.nan,np.nan] }) df2 = pd.DataFrame({ '局コード':[1,2,3,1], '日付':['4/1','4/1','4/3','4/5'], '開始時間':[1130,1130,1045,930], '終了時間':[1255,1256,1150,955], '番組コード':['ABC1','BBC2','CBC3','AAA1'] }) for idx,row in df1.iterrows(): res = df2[(df2['局コード'] == row['局コード']) & (df2['日付'] == row['日付']) & (df2['開始時間'] <= row['time']) & (df2['終了時間'] >= row['time'])] if not res.empty: df1.loc[idx, '番組コード'] = res.iloc[0]['番組コード'] print(df1) # time 局コード 日付 番組コード #0 1132 1 4/1 ABC1 #1 1135 3 4/3 CBC3 #2 1221 3 4/4 NaN ```