2016-12-29 10 views
0

私は2つのテーブルの動的ファジー論理結合をしようとしています。私がダイナミックを意味するのは、引数が2つのテーブルを結合させる変数を指定できるようにすることです。私は以下の動的なコードコンパイルし Python Pandas fuzzy merge/match with duplicatespython動的ファジー論理結合

: コードは、以下に記載の次のリンクの下の静的コードの修正版である

import pandas as pd 
import datetime 
from fuzzywuzzy import fuzz 
import difflib 

donors = pd.DataFrame({"name": pd.Series(["John Doe","John Doe","Tom Smith","Jane Doe","Jane Doe","Kat test"]), "Email": pd.Series(['[email protected]','[email protected]','[email protected]','[email protected]','[email protected]','[email protected]']),"Date": (["27/03/2013 10:00:00 AM","1/03/2013 10:39:00 AM","2/03/2013 10:39:00 AM","3/03/2013 10:39:00 AM","4/03/2013 10:39:00 AM","27/03/2013 10:39:00 AM"])}) 
fundraisers = pd.DataFrame({"name": pd.Series(["John Doe","John Doe","Kathy test","Tes Ester", "Jane Doe"]),"Email": pd.Series(['[email protected]','[email protected]','[email protected]','[email protected]','[email protected]']),"Date": pd.Series(["2/03/2013 10:39:00 AM","27/03/2013 11:39:00 AM","3/03/2013 10:39:00 AM","4/03/2013 10:40:00 AM","27/03/2013 10:39:00 AM"])}) 
donors["Date"] = pd.to_datetime(donors["Date"], dayfirst=True) 
fundraisers["Date"] = pd.to_datetime(donors["Date"], dayfirst=True) 
donors["code"] = donors.apply(lambda row: str(row['name'])+' '+str(row['Email']), axis=1) 
idx = donors.groupby('code')["Date"].transform(min) == donors['Date'] 
donors = donors[idx].reset_index().drop('index',1) 

def get_donors_v1(fund_var,don_var, don_tab,row=None): 
    d = don_tab.apply(lambda x: fuzz.ratio(x["%s" % don_var], 'row["%s" %fund_var]') * 2, axis=1) 
    d = d[d >= 75] 
    if len(d) == 0: 
     v = ['']*3 
    else: 
     v = don_tab.ix[d.idxmax(), ["%s"% don_var ,'Email','Date']].values 
    return pd.Series(v, index=['donor name', 'donor email', 'donor date']) 

trial=pd.concat((fundraisers, fundraisers.apply(get_donors_v1(fund_var="name",don_var="name",don_tab=donors), axis=1)), axis=1) 

を私は、次のエラーを取得:

TypeError: get_donors_v1() takes exactly 4 arguments (3 given)

この機能を次のものに置き換えてください。

get_donors_v1(row=None,fund_var,don_var, don_tab) 

その後、私は次のエラーを取得する:

TypeError: ("'NoneType' object has no attribute 'getitem'", u'occurred at index 0')

助けてください。

+1

私はデフォルト値を最後に置く必要があるので、get_donors_v1(fund_var、don_var、don_tab、row = None)がこのトリックを行うことができると思いますか? – Guido

+0

こんにちはGuido、私はこれを試みた。いいえ助けてください:( – Seb

答えて

2

コード例では、引数 'row'に値Noneを指定してget_donors()を指定します。次の行では、オブジェクトが存在するかどうかをテストせずに、行をマップ(行["%s"%fund_var])として使用しようとしています。

'row ["%s"%fund_var]のようなオブジェクトを索引付けすると、getitemメソッドが呼び出されます。

+0

私はこれを試しました。私は非常にPythonをよくしていません。 – Seb

+0

こんにちはuser508402、私はポストを修正しましたあなたのソリューションを試しましたが、このTypeErrorを得る:( "'シリーズ'オブジェクトは呼び出すことはできません"、u'occurredインデックス0 ')。私はPythonを学んでいる途中です。私のクエリがペダンシーに見える場合はお詫び申し上げます。 – Seb

+0

こんにちはSeb。' xxxxは呼び出し可能ではありません 'というエラーは、オブジェクトが関数のように呼び出されるということです。エラーが発生した行と、呼び出されているシリーズオブジェクトの行を見つけてください。 "pd.Series(...)"のようにはなりません。正当なコンストラクタです。 – user508402