2017-09-15 7 views
0

私の質問は、効率的なファイルから抽出した2つのパンダdfの一致を見つけるために正規表現パターンを効率的に使用することです。pandasデータフレーム内の2つの列間の正規表現パターンを効率的に一致させる方法は?

まず、問題を調べていただきありがとうございます。私は非常にPythonには新しく、さらに大規模なデータセットを扱うときにはそうです。私は非常に最後の手段としてスタックを使用すべきであることを知っています。

今私は壁に頭を打って、おそらく単純なものを求めています。

問題: 私は2つのExcelファイルを持っている:

つだけ1列×300行=元のURL

他方は20Kから非常に大きくなると、より多くの翻訳のURLができ

です目的: 私はオリジナルのURLを持っており、大きなエクセルファイルにある翻訳された対応物を見つけなければなりません。 2つのURL間

唯一の共通点は、私は合併について考えているが、それは部分一致であるので、それは私の最高に(動作しません。どこかURL

で8桁の番号です知識) 私は潜在的に興味深い解決策を見つけました:.whereこれは、私が欲しいものを正確に行うことを可能にします。しかし、私はこのエラーが発生します:

master_list [crawlfr.url.where(number_search.search(master_list).group(0)== number_search.search(crawl_fr).group(0)、master_list] URL) TypeError:予想される文字列またはバッファ

私はこのエラーを理解しているので、問題は文字列以外のものを取っていない正規表現から来る可能性があります。

実際、このような関数で一致オブジェクトを抽出して2つの文字列を比較すると、それが機能します。

def skl_finder(master_list,crawl_fr): 
    skl_search=re.compile("\d{8}") 
    if skl_search.search(master_list).group(0) == 
    skl_search.search(crawl_fr).group(0): 
     return skl_search.search(master_list).group(0) 

私はこの質問は私が何をしたいのかに非常に近いと思いますが、それはすべての回答を持っていなかった。Pandas: Comparing two dataframes with identical data structure but differences in data using pattern matching

import regex as re 
import pandas as pd 
crawl_loc="translated_file_set.xlsx" 

master_list_loc="original_fileset.xlsx" 

crawlfr=pd.read_excel(crawl_loc,parse_cols="E") 

master_list=pd.read_excel(master_list_loc) 

number_search=re.compile("\d{8}") 

master_list["translated"] = 
crawlfr.url.where(number_search.search(master_list).group(0) == 
number_search.search(crawl_fr).group(0), master_list.url) 


master_list.to_excel("result_file.xlsx") 
+0

あなたの問題が何であるか、スピードをクリアしていませんか? IMOでは、検索キーをあらかじめ計算しておくことができます。つまり、ファイルの数字を抽出し、新しい列として整数に変換して検索します。 – georgexsh

+0

速度と、2つの列の間に正規表現を適用する方法。前述のように、私は正規表現でエラーがあり、この場合、2つのカラムの間で一致するパターンを使用するための実用的な解決策を見つけることができません。 –

+0

転送は文字列のリストにExcel、それらに検索キーを計算する、あなたが慣れていないパンダのIMOと簡単に比較されます。 – georgexsh

答えて

0

あなたのURL COLSはDTYPE strであることを確認してください。

ごとに、8桁のIDを持つ新しいCOLSを作成してみてください:

crawlfr['url_id'] = crawlfr.url.str.extract("\d{8}") 
master_list['url_id'] = master_list.url.str.extract("\d{8}") 

その後joinurl_id上:

crawlfr.join(master_list, on='url_id') 
関連する問題