2017-02-23 19 views
1

私は現在、ファジィロジックに参加する必要があるデータセットを持っています。データフレームdf1は、約10回の観測値を持つ、より小さな参照テーブルです。データフレームdf2は私の主なデータフレームであり、ファジー論理結合を実行する必要がある約2000回の観測があります。私は以下の例と私の試みを提示する。Python pandas fuzzy logic

import difflib 
df1 = pd.DataFrame({'number':[1,2,3,4,5],'not_shifted':['one','two','three','four','five']}) 
df2 = pd.DataFrame({'values':[['test'],['a'],['b'],['c'],['d'],['e'],['f'],['f'],['f']],'not_shifted':[np.nan,'one','too','three','fours','five','six',np.nan,'one']}) 

# my approach 
df2['not_shifted'] = df2['not_shifted'].map(lambda x: difflib.get_close_matches(x, df1['not_shifted'])[0]) 

は、私は次のエラーを取得する:あなたが得る

List out of range

答えて

1

: リストを範囲

TypeError: 'float' object is not utterable

のうち、私は何か他のものとnp.nanを交換した場合、私は別のエラーが出ますTypeErrorデータフレームdf2にはn値があるため、削除する必要があります。

もう1つの問題:df1に 'six'のルールがなく、df2['not_shifted'] = df2['not_shifted'].map(lambda x: difflib.get_close_matches(x, df1['not_shifted'])[0])はリストの1つが空のためにエラーList out of rangeを生成します。

あなたのコードは次のようになります(または、df1に 'six'のルールを追加するとyour_approachを使用することができます)。

import pandas as pd 
import numpy as np 
import difflib 

df1 = pd.DataFrame({'number':[1,2,3,4,5],'not_shifted':['one','two','three','four','five']}) 
df2 = pd.DataFrame({'values':[['test'],['a'],['b'],['c'],['d'],['e'],['f'],['f'],['f']],'not_shifted':[np.nan,'one','too','three','fours','five','six',np.nan,'one']}) 

# Drop nan value 
df2=df2.dropna() 

# You cat write [0] because df1 does not have 'six' 
df2['not_shifted'] = df2['not_shifted'].map(lambda x: difflib.get_close_matches(x, df1['not_shifted'])) 
print df2 

出力:

not_shifted values 
1  [one] [a] 
2  [two] [b] 
3  [three] [c] 
4  [four] [d] 
5  [five] [e] 
6   [] [f] 
8  [one] [f] 
+0

こんにちはセレニティは、迅速な対応と解決策をありがとう:) – Seb

+0

こんにちはセレニティを、私はデータフレームに角括弧を取り除くにはどうすればよいです。答えは正しいですが、ソリューション内の角括弧は少し混乱を招いています。このデータフレームにリストを定義する目的は何ですか?ありがとう。 – Seb