2017-05-03 16 views
0

我通常不是一個python用戶。我在R和Stata中做了大部分事情。但是,我無法在其中找到一個好的語義相似性包/ API。在函數調用中訪問特定數據的Python語法是什麼?

我在環境中有兩個數據幀。一個是問題,它由2列和3行組成。另一個是結果,有3列和3行。

我試圖將問題數據框第一列中的每個問題(單獨)與第二列中的所有問題進行比較。然後我希望輸出填充結果數據框。這個函數有兩個字符串作爲參數到目前爲止,我的代碼如下所示:

for i in range(1, 3): 
     results.iloc[i-1,i] = liteClient.compare(questions.iloc[0,i], questions.iloc[:,1]) 

我以爲我指向正確的數據,但我真的一直沒能找到有關這個看似簡單的問題,良好的文檔。

通過比較,這裏是我工作的R代碼,它使用稍微不同的功能和只有一個數據幀。

for (i in 1:3){ 
     df[,i+2] <- levenshteinSim(df$yr1questions[i], df$yr2questions) 
    } 

任何幫助將不勝感激!我試圖提出概念驗證代碼來比較基於語義意義的年度間類似的調查問題。

鮑勃

+0

什麼Python版本您使用的? – snb

+0

@snb我通過Jupyter Notebook使用Anaconda 3.5.0。 – rtaylor

+0

好吧,我可能會幫助你,讓我快速寫出一個答案 – snb

回答

0

讓我們嘗試比較()每質疑問題B

import pandas as pd 
questions = pd.DataFrame(np.arange(6).reshape(3,2), columns=["question_A", "question_B"]) 

這給:

question_A question_B 
0   0   1 
1   2   3 
2   4   5 

然後讓我們定義一個比較功能:

def compare(row): 
    return pd.Series(row[0]*questions['question_B']) 

results = questions.apply(compare, axis=1) 

這給了我們:

0 1 2 
0 0 0 0 
1 2 6 10 
2 4 12 20 

當您在評論中指出,這裏是在同一時間僅比較兩個字符串版本:您所基於什麼

def compare(row): 
    question_a = row[0] 
    return pd.Series([liteClient.compare(question_a, question_b) for question_b in questions['question_B']]) 
+0

謝謝,我會看看我能否得到這個工作。 – rtaylor

+0

這工作!是否有快速的方法讓結果按列而不是按行填充?這樣col1row1比較的輸出將在結果數據框的col1中?然後col1row2結果將在結果數據框的col2中。這太棒了...我只是有很多東西來學習python。 – rtaylor

+0

我只是用熊貓換了它。沒什麼大不了的!非常感謝你的幫助。 – rtaylor

0

到目前爲止,這裏有一些問題與你寫的東西,這是你的R編程背景可以理解的:

for i in range(1, 3): 

在python 3.x中,這樣做的是創建一個range object,您可以將其視爲一種特殊類型的函數(though is really an object that contains iteration properties),它允許您生成具有特定步長的數字序列(缺省值爲1)獨家。此外,您需要知道大多數編程語言索引從零開始,而不是1,並且這包括python。

這個範圍對象在這裏所做的是生成序列1, 2就是這樣。

您正在使用i索引的數組不會索引所有索引。我相信你要的是這樣的:

for i in range(3): 

注意如何只有一個號碼在這裏,這個默認範圍內的獨家最大值,0是包容性最低,因此這將產生0,1,2序列。如果你有一個大小爲3的數組,這將代表該數組的所有可能的索引。

這下一行是有點混亂給我,因爲我不熟悉的R,但我有點明白你想幹什麼。如果我理解正確,你試圖比較兩列中的三個問題,並將第一列中的每個問題與第二列中的問題進行比較,從而產生一個3 x 3的比較結果矩陣,您試圖將結果存儲在結果中?假設大小已經是正確的(因爲結果是3x3),我想解釋一下我在這段代碼中看到的一些特性。

results.iloc[i-1,i] = liteClient.compare(questions.iloc[0,i], questions.iloc[:,1]) 

與results.iloc [I-1,I]你要由行編制索引的列,如I-1是行,以及i是列在這裏。因此,如果不更改range(1,3),則會導致訪問以下索引:0,1,1,就是這樣。我相信liteClient.compare(...)應該返回一個1x3的數據框,或者基於你想要在裏面做什麼的大小爲3的列表,但這可能不是這種情況,但我不是確定你用什麼對象來調用該成員函數,所以我不知道該函數的文檔在哪裏存在。假設它不會返回尺寸3的list或數據幀,則需要更改您要分配數據的方式,通過這個什麼:

results.iloc[i,:] = ... 

這裏發生的事情是,iloc(...)走的是一條行位置參數和切片位置參數,這裏您將該行結果矩陣中的所有列分配給compare返回的值。隨着for語句的更改,它將迭代數據幀中的所有索引。

liteClient.compare(questions.iloc[0,i], questions.iloc[:,1]) 

這條線,因爲它目前代表你會遍歷每列questions.iloc的第一排,然後比較它們的第二列,第二questions.iloc的所有行。

我相信你會想要做的是將其更改爲:

liteClient.compare(questions.iloc[i,0], questions.iloc[:,1]) 

這樣做是對每個i,0,1,2,在列0,列1比較這對每一行如果你的問題數據框是實際上組織成2列和3行這應該工作,否則你將需要改變你如何創建問題。

所有

我相信固定程序應該是這個樣子:

for i in range(3): 
    results.iloc[i,:] = liteClient.compare(questions.iloc[i,0], questions.iloc[:,1]) 
+0

謝謝你的詳細解釋。我想我現在開始在這裏看到另一個問題。該功能來自cortical.io「retinasdk」。我認爲一個問題是,它一次只需要兩個字符串。所以我真正需要做的是將第一個問題列中的第一個觀察結果與第二個問題列中的第一個觀察結果進行比較。之後,我必須再次將col1row1與col2row2和col2row3進行比較。然後我會移動col1row2與col2row1,然後col2row2,然後col2row3比較。我不認爲我的代碼實際上這樣做。每個循環只能有一個輸出。 – rtaylor

相關問題