2017-05-10 3 views
0

私はこの質問があまり意味がないかもしれないことは知っていますが、うまくいけば次の例でそれを明確にします。私は列sentAで1つの文字列を参照し、それをsentBのすべての文字列と比較する必要があります。次の例は、私がquestionsと定義したデータフレームを示しています。Pythonの不均一な列より関数をどのように反復処理しますか?

sentA  sentB 
str1  str1 
str2  str2 
      str3 

私は現在、唯一の偶数列を比較することができます使用するとこのようになりますよコード:

def compare(row): 
    sentA = row[0] 
    return pd.Series([simalarity_funct(sentA, sentB) for sentB in questions['sentB']]) 

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

このコードはstr1A(str1B、str2B、およびstr3Bへの類似性)のために私に3つの出力を与え、それらを列に入れます。ここで

は数字DFの入力に基づいて単純化されたコードと別の例である:

num1 num2 
    3  5  
    4  6 
      7 

def multiply(num1, num2): 
    return num1*num2 

def compare(row): 
    num1 = row[0] 
# I would like to prevent this next statement from passing an "NaN" to the 
# multiply function. The empty cells will always be at the end of the column. 
    return pd.Series([multiply(num1, num2) for num2 in numbers['num2']]) 

results = numbers.apply(compare, axis=1).T 
print(results) 
15  20  NaN 
18  24  NaN 
21  28  NaN 

根本的な問題は、それが不良データを供給されている場合、私の類似度関数がエラーをスローしますということです。私がこれを修正すると考えることができる最も簡単な方法は、悪いデータを与えないことです。類似点関数に "NaN"を渡さないように最後のステップを変更する方法はありますか?

+0

孤立した抜粋ではなく、完全に実行できる例を提供してください。 – Gabriel

+1

私はこれを説明するために使用できる別の機能について考えようとします。私が使用している関数を定義するには、いくつかの大きなライブラリと数十行のコードが必要です。私はそれを更新します。 – rtaylor

+1

@Gabriel私は、実行可能な例を明確にしようとしました。 – rtaylor

答えて

1
def compare(row): 
    num1 = row[0] 
    pd.Series([multiply(num1, num2) for num2 in numbers[numbers.num2.notnull()].num2 ]) 

numbers[numbers.num1.notnull()].apply(compare, axis=1).T 
+0

Woohoo!これはうまくいった。うまくいけば、それは私の計算時間を増加させません。 200x200の入力データフレームでは、この処理には6時間かかります。 – rtaylor

+0

@rtaylorあなたはコード200を最適化する必要があると思います* 200は大規模なデータではありません – galaxyan

+0

私は私がより良くできることを知りたがっています。これはWordNetの実装です。私は、最大の問題は、各インタレーションで文字列を再処理しなければならないということです。それは辞書やその他のものに対してそれらをチェックしている。 – rtaylor

関連する問題