2016-12-29 168 views
0

我想为2个表做一个动态模糊逻辑连接。我的意思是动态允许参数指定允许两个表加入的变量。 下面的代码说明是静态代码的以下链接修改后的版本: Python Pandas fuzzy merge/match with duplicates蟒蛇动态模糊逻辑加入

我编下面的动态代码:

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“)),而不测试对象是否存在,即:not equals None。

对像'row [“%s”%fund_var]“这样的对象进行索引会导致调用getitem方法,即None确实没有。

+0

我试过这个,我不是很擅长python – Seb

+0

你好user508402,我修改了这个帖子,我尝试了你的解决方法,但是得到这个TypeError:(“'Series'object is not callable”,u'ccurred at索引0')。我正在学习Python的过程 - 我很抱歉,如果我的查询似乎迂腐 – Seb

+0

嗨Seb。'xxxx不可调用'错误意味着一个对象被调用像一个函数,所以它的标识符后面跟着例如:mySeries()。找到错误出现的那一行,并在那一行中调用被调用的系列对象,注意它不应该像“pd.Series(...)”那样,是一个合法的构造函数。 – user508402