python pandas 大量のデータフレームから特定の列を比較・条件に合った行を抽出して隣の列の値を更新したい
python pandas 大量のデータフレームから特定の列を比較・条件に合った行を抽出して隣の列の値を更新したい
[df1]
id, ip, url, point
4, , https://www.google.co.jp, 0
5, 8.8.8.8, , 0
122, , https://ja.stackoverflow.com/, 0
[df2]
src, ip, url, point
92, , https://stackoverflow.com/, 0
111 , https://ja.stackoverflow.com/, 0
115, , https://stackexchange.com, 0
[df(x万件)]
random_col , ip, url, point
(ランダム),(任意),(任意),0(初期値)
というデータをもつデータフレームと、
[point1_df]
ip, url, point
8.8.8.8, , 15
, *.stackoverflow.com, 10
, stackexchange.com, 8
[point2_df]
ip, url, point
...(該当なし。)
...
[point(x千件)_df]
ip, url, point
(固有値), (固有値), (一意)
があったとして、
[expected_df1]
id, ip, url, point
4, , https://www.google.co.jp, 0
5, 8.8.8.8, , 15
122, , https://ja.stackoverflow.com/, 10
[expected_df2]
id, ip, url, point
92, , https://stackoverflow.com/, 10
111 , https://ja.stackoverflow.com/, 10
115, , https://stackexchange.com, 8
のような結果を得るためにはどのようにすればよいでしょうか?
[注意]
df(1,2, ... ,x)やpoint(1,2, ... ,x)_dfにはそれぞれのdf内で重複があります。
dfの重複はそれぞれが別のものとして扱われます。
point_dfの重複は無視できるものとします(先勝ち・後勝ちは不問)
・やりたくないこと
select point1_df.point
from df1,point1_df
where df1.ip = point1_df.ip
select point1_df.point
from df2,point1_df
where df1.url = point1_df.url
select point1_df.point
from df1,point1_df
where df1.url = point1_df.url
のようなSQLを書いて、ifなどで結果を判断して張り付けていくような書き方をするとコードがとてつもない事になるので、pandasのメソッドなどでスマートに実現できればと思っています。
[上手くいかなかった方法]
point_dfs = [point1_df, point2_df, ... ,point(x)_df]
merge_df = df1
for point_df in point_dfs:
merge_df = pd.merge(merge_df, point_df, on=ip)
merge_df = pd.merge(merge_df, point_df, on=url)
データ量が少なければこの方法でもいいんですが、データフレームを扱う時にforを使うと異様に遅くなる気がします。
実際にforのような処理を求められる場合はリスト内包表記などで書いていますが、大きく改善は出来なかったので、あまりネストを深めないための措置という程度の認識で使うようにしています。
よろしくお願いします。