下図のようなdataframeの結合は可能でしょうか。
df1とdf2の'name'が一致しており、
df1の'date'から見てdf2の'date'が3ヶ月以内のデータのみを結合、抽出
単純にmergeするだけだと、上手くいかず、いい方法が全く思いつきません。
実際は、大量のデータの為、forで回すのは現実的ではありません。
できるだけ時間がかからない方法があれば教えてください。
dfx = pd.merge(df1, df2, on='name').query('(date_x - date_y).abs().astype("timedelta64[M]") < 3.0')
で抽出できますが、merge + query なので時間が掛かりそうです。一度試してみて下さい。(date 列は datetime 型という前提です)
一度全てをmergeして、該当のものだけ取り出せばよかったんですね。
難しく考えすぎました。ありがとうございます。
ちなみに、教えていただいたコードでは、【unhashable type: 'numpy.ndarray'】と出てしまって、
エラーの意味が良く分かりません。。。
merge の段階のエラーなのか、それとも query でのエラーなのか確認したいので merge だけを実行してみて下さい。
df3 = pd.merge(df1, df2, on='name')
mergeは上手くできました。
df3[(date_x - date_y).abs().astype("timedelta64[M]" < 3.0]
で抽出すると上手くいきましたので、queryが上手くいかなかったようです。
了解です。実行時間的に問題なければ、その抽出方法でよいかと思います。
ありがとうございます!
ベストアンサーに選ばせていただきたいのですが、下記を回答していただくことは可能でしょうか?
df3 = pd.merge(df1, df2, on='name')
df3[(date_x - date_y).abs().astype("timedelta64[M]") < 3.0]
ありがとうございます、ただ、
df3[(date_x - date_y).abs().astype("timedelta64[M]") < 3.0]
は、
df3[(df3['date_x'] - df3['date_y']).abs().astype("timedelta64[M]") < 3.0]
となっていませんでしょうか?
大変失礼しました。
df3 = pd.merge(df1, df2, on='name')
df3[(df3['date_x'] - df3['date_y']).abs().astype("timedelta64[M]") < 3.0]
です。
ありがとうございます、回答に書きました。
回答1件