2017-08-25 101 views
3

我有两个数据框:datarulesPython:应用Dataframe不接受轴参数

>>>data       >>>rules 
    vendor        rule 
0 googel       0 google 
1 google       1 dell 
2 googly       2 macbook 

我试图计算每个供应商和规则之间的相似莱文斯坦后,两个新列添加到data数据帧。所以,我的数据框应该非常包含看起来像这样的列:

>>>data 
    vendor rule similarity 
0 googel google 0.8 

到目前为止,我试图执行一个apply函数将返回我这个结构,但数据帧适用不接受axis说法。

>>> for index,r in rules.iterrows(): 
...  data[['rule','similarity']]=data['vendor'].apply(lambda row:[r[0],ratio(row[0],r[0])],axis=1) 
... 
Traceback (most recent call last): 

File "<stdin>", line 2, in <module> 

File "/home/mnnr/test/env/test-1.0/runtime/lib/python3.4/site-packages/pandas/core/series.py", line 2220, in apply 
mapped = lib.map_infer(values, f, convert=convert_dtype) 
File "pandas/src/inference.pyx", line 1088, in pandas.lib.map_infer (pandas/lib.c:62658) 
File "/home/mnnr/test/env/test-1.0/runtime/lib/python3.4/site-packages/pandas/core/series.py", line 2209, in <lambda> 
f = lambda x: func(x, *args, **kwds) 

TypeError: <lambda>() got an unexpected keyword argument 'axis' 

有人能帮我弄清楚我做错了什么吗?我所做的任何更改只是创建新的错误。谢谢

+0

什么'比率'实际上在这里做,因为我觉得你可以做这个'不'应用',所以它的向量化 – EdChum

+0

'比率'是来自'Levenshtein'库的函数,将返回相似性度量 –

+0

是否有1: 1 dfs之间的关系?你只是逐行迭代并计算每个相应行之间的levenshtein距离? – EdChum

回答

3

您正在调用Series版本的apply,因此无法通过axis arg查看错误。

如果你做的事:

data[['rule','similarity']]=data[['vendor']].apply(lambda row:[r[0],ratio(row[0],r[0])],axis=1) 

这会是一列DF针对这样的工作

或者只是删除axis ARG:

data[['rule','similarity']]=data['vendor'].apply(lambda row:[r[0],ratio(row[0],r[0])]) 

更新

看着w你需要为每个供应商计算每个规则的levenshtein比率。

你可以这样做:

data['vendor'].apply(lambda row: rules['rule'].apply(lambda x: ratio(x, row)) 

这个我认为应该计算针对每一个规则每个供应商的比例。

+0

这两种方法现在都出现这个错误:'KeyError:'['rule''similarity'] not in index“ –

+0

@BhargaviSri首先,'data'是一个系列。我不确定你想要做什么。 –

+0

对于每个供应商,我需要一个与规则相关的相似度值。因此,我用'['google','dell','macbook']为每个规则获得'google','dell','macbook']和'google'相似度得分'',最后'googly'与'['google','dell','macbook']的相似度得分' –