2017-08-25 73 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']的相似度得分' –