2017-08-08 5 views
1

給与カテゴリ列がExpenseの場合は、ツールタイプ列にLegalを設定するif文を作成しようとしています。値を再マップする文の場合

しかし、有料カテゴリにかかわらず、Legalが含まれているすべてのフレーズはLegalです。

test={"Pay Category":["Indemnity","Indemnity","Indemnity","Indemnity","Expense","Expense","Expense","Medical"],"Description of Payment":["Legal","Legal","Legal","Legal","Legal","Legal","Frog","Legal",]} 
test=pd.DataFrame(test) 

test["Tool Type"]="" 
if (test["Pay Category"]=="Medical") is not False: 
test["Tool Type"][test["Description of Payment"].str.contains("Pharmacy|Prescription|RX",case=False)]="Pharmacy" 

if (test["Pay Category"]=='Expense') is not False: 
test["Tool Type"][test["Description of Payment"].str.contains("Legal|Attorney|Court|Defense",case=False)]="Legal" 

私の理解では、if (test["Pay Category"]=='Expense') is not False:True or Falseのいずれかであるブール値である基準が「偽ではありませんが、」満たされた場合、それが唯一のif文を実行する必要があり、です。私は何が欠けていますか?

ブランドン

+0

「支払い」列の説明を検索すると、これらのキーワードはすべてツールタイプの列で法的に割り当てられます。 – Bjc51192

答えて

3

私はあなたが条件を追加必要があると思うと&and)とそれらをチェーン:

test["Tool Type"]="" 
m1 = test["Description of Payment"].str.contains("Pharmacy|Prescription|RX",case=False) 
m2 = test["Pay Category"]=="Medical" 

m3 = test["Description of Payment"].str.contains("Legal|Attorney|Court|Defense",case=False) 
m4 = test["Pay Category"]=="Expense" 

test.loc[m1 & m2, "Tool Type"]="Pharmacy" 
test.loc[m3 & m4, "Tool Type"]="Legal" 
print (test) 
    Description of Payment Pay Category Tool Type 
0     Legal Indemnity   
1     Legal Indemnity   
2     Legal Indemnity   
3     Legal Indemnity   
4     Legal  Expense  Legal 
5     Legal  Expense  Legal 
6     Frog  Expense   
7     Legal  Medical   

ダブルnumpy.whereを持つ別の解決策:

test['Tool Type'] = np.where(m1 & m2, 'Pharmacy', 
        np.where(m3 & m4, 'Legal', '')) 
print (test) 
    Description of Payment Pay Category Tool Type 
0     Legal Indemnity   
1     Legal Indemnity   
2     Legal Indemnity   
3     Legal Indemnity   
4     Legal  Expense  Legal 
5     Legal  Expense  Legal 
6     Frog  Expense   
7     Legal  Medical   

はEDIT:と非常に素晴らしいソリューションをunutbuコメントは使用numpy.select

+0

偉大な解決策、私は私の試みでどこが間違っていた可能性を明確にすることができますか? – Bjc51192

+1

スカラーではなく、配列を扱うのに問題があると思います。したがって、いくつかの条件が必要な場合は、 'True'と' False'値の配列を使って作業してください。だから、[ブールインデックス作成](http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing)とチェンジング条件が必要です。 – jezrael

+0

ありがとうございます。乾杯。 – Bjc51192

関連する問題