2016-07-26 5 views
1

以下は私のコードです。私はDataFrameを解析し、会社の一致を保存しようとしています。しかし、ifステートメントは常にtrueを返し、データフレームcurrent_customersにすべてが保存されますが、150行のうち約10行には97より大きい値があります。私のコードは私のデータのサンプルです。複雑なif文がすべてを返す

current_customers = pandas.DataFrame() 
potential_customers = pandas.DataFrame() 
for i in range(0, len(FDA_useful_companies_bing)): 
    if combined_data['match token sort'].iloc[i] or combined_data['match ratio'].iloc[i] or combined_data['match partial ratio'].iloc[i] > 97: 
     current_customers = current_customers.append(combined_data.ix[i,4::]) 
    else: 
     potential_customers = potential_customers.append(combined_data.ix[i,4::]) 

私のデータのサンプル

Company        City   State  ZIP  FDA Company     FDA City   FDA State FDA ZIP Token sort ratio    match token sort Ratio       match ratio Partial Ratio   match partial ratio 
NOVARTIS       Larchwood  IA   51241 HELGET GAS PRODUCTS INC  Kansas City   MO   64116 AIR PRODUCTS CHEMICALS INC 73    OCEANIC MEDICAL PRODUCTS INC 59    LUCAS INC    78 
BOEHRINGER INGELHEIM VETMEDICA INC Sioux Center IA   51250 SOUTHWEST TECHNOLOGIES INC North Kansas City MO   64116 SOUTHWEST TECHNOLOGIES  100    SOUTHWEST TECHNOLOGIES   92    SOUTHWEST TECHNOLOGIES 100 

EDIT:これを行うには、より効率的な方法がある場合 また、私が聞くのが大好きです。

+0

私は、 pandasデータフレームがifステートメントでどのように動作するかと関係があります。 – Jstuff

+0

いいえ、問題は標準のPythonです。 'foo or bar or baz> 97'はfooとbarの0以外の値に対して常にTrueを返します。 –

+0

あなたは正しいです。私はエラーを理解していませんでした。 – Jstuff

答えて

2

IIUCあなただけ行うことができます:

それはあなたが期待通りに最後の数値に対するすべての条件を比較していないとしてゼロ以外の値が Trueに評価されますので、あなたが短絡を試してみました何
current_customer = combined_data[(combined_data[['match token sort','match ratio','match partial ratio']] > 97).any(axis=1)] 

potential_customer = combined_data[(combined_data[['match token sort','match ratio','match partial ratio']] <= 97).all(axis=1)] 

if combined_data['match token sort'].iloc[i] or combined_data['match ratio'].iloc[i] or combined_data['match partial ratio'].iloc[i] > 97: 

だから、これは同等です:

if some_val or another_val or last_val > 95 

some_valがゼロまたはanother_valであればNON_ZEROその後、文全体がTrue

に評価されるので、ここであなたが簡略化された場合に、この見ることができます。

In [83]: 
x = 1 ​ 
if 5 or x > 95: 
    print('True') 
else: 
    print('False') 

この出力:

True 

を1つの比較だけで:

In [85]: 
if 5 > 95: 
    print('True') 
else: 
    print('False') 

outpあなたは、

False 

をが、ここで本当のポイントは、すべてではないループにある:UTS:

False 

が、目標値と比較して、それぞれの値を持つ:

In [87]: 
x=1 
if 5 > 95 or x > 95: 
    print('True') 
else: 
    print('False') 

これは今印刷します関心のある列のリストを渡すことによってdfからサブ選択することができます。次に、df全体をスカラー値と比較し、any(axis=1)を使用してブールマスクを生成し、これを使用してdfをマスクして後退させますあなたが現在の顧客である場合は、比較を逆転して、使用している顧客のdfをフィルタリングするために前の比較を満足していない行を見つけるためにall(axis=1)を使用してください。

+0

私はこれを行う簡単な方法がなければならないことを知っていた。あなたの事例で常にそれが常に評価される理由を説明する時間をとっていただきありがとうございます! – Jstuff

+0

'axis = 1'コマンドは理解できません。 – Jstuff

+1

'axis = 1'パラメタは、' axis = 0'である列方向ではなく行方向で比較を行いたい場合、 '1'から' 0'に変更して比較を試みるべきです – EdChum

0

あなたが疑われるとして、あなたの問題は、if文である:

if combined_data['match token sort'].iloc[i] or combined_data['match ratio'].iloc[i] or combined_data['match partial ratio'].iloc[i] > 97: 

をあなたがあれば表現求めている "combined_data [ 'と一致するトークンの並べ替えを'] ILOC [I]は、" それがある、真実であります0より大きい数値なので、Pythonによるとtruthey値です。したがって、式全体がTrueを返します。

私は、Pythonのコード行を解釈され、それがより明確にどのようにするために、括弧を追加します:

if (combined_data['match token sort'].iloc[i]) or 
    (combined_data['match ratio'].iloc[i]) or 
    (combined_data['match partial ratio'].iloc[i] > 97): 

Pythonは別途括弧内のステートメントを評価し、そしてPython considers any non-zero number to be a "truthey" value、ひいては条件として使用されていることTrueを返します。ここに修正された式があります:

if (combined_data['match token sort'].iloc[i]) > 97 or 
     (combined_data['match ratio'].iloc[i]) > 97 or 
     (combined_data['match partial ratio'].iloc[i] > 97): 

ここで、Pythonはそれぞれの操作を意図したとおりの比較操作として実行します。

関連する問題