2015-10-08 4 views
0

Моя цель проста.python if statement with multiple critieria

С ниже dataframe (DF3):

если mr_no равно определенное число (у меня есть список для этого ниже), то огонь, если Fire1 равно покрыта затем огонь, и если Пуск2 равно к первому или второму, затем к огню, иначе, если ни один из этих трех критериев не будет удовлетворен, чем они не являются огнем.

DF3:

 mr_no  fire1 fire2 
0 A5155  covered primary 
1 FS2328  covered neither 
3 133158 not_covered primary 
4 FS2328 not_covered neither 
5 A5128 not_covered neither 
6 A5128 not_covered neither 
7 133158  covered primary 
8 133158 not_covered neither 
9 A5128 not_covered neither 
10 A5129 not_covered neither 

Я попытался следующие, чтобы извлечь код мне нужно:

mr = ["A5115","133158","FS2114","FS2110","FS2115","FS2111","FS2149","FS2150","FS2017","FS2018"] 

def fire(row): 
    if row['fire1'] == ('covered') + row['fire2'] == ('primary') | ('secondary') + row['mr_no'] == (mr): 
     return 'fire' 
    return 'not fire' 

df3['fire_final'] = df3.apply (lambda row: fire(row),axis=1) 

Однако мои результаты не ни нашли, но я знаю, что там должно быть что-то:

IN: df3.groupby('fire_final').ssno.count() 

OUT: fire_final 
not fire  214166 
Name: ssno, dtype: int64 

Я думаю, что моя ошибка с моим списком, но мои знания в программировании по-прежнему новички, поэтому я n Конечно, как сделать условие для списка.

Как всегда, я очень благодарен за помощь.

UPDATE:

Попытка код, рекомендованный edChum дали результаты, но как вы можете видеть грести 120044 и 120045 показывает Fire1 была «покрыта» и Пуск2 был основным, но они придумали, как не срабатывают, но они должны показать, как Огонь.

df3['fire_final'] = np.where((df3['mr_no'].isin(mr)) & (df3['fire1'] == 'covered') & (df3['fire2'].isin(['primary','secondary'])), 'fire', 'not fire') 


     mr_no  fire1  fire2 fire_final 
120020 203670 not_covered neither not fire 
120021 001500 not_covered neither not fire 
120022 5273 not_covered neither not fire 
120023 190365 not_covered neither not fire 
120024 A5155 not_covered neither not fire 
120025 236707 not_covered neither not fire 
120026 A9088 not_covered primary not fire 
120027 A9088 not_covered primary not fire 
120028 FS1476 not_covered primary not fire 
120029 A9092 not_covered primary not fire 
120031 FS1476 not_covered neither not fire 
120032 FS1476 not_covered neither not fire 
120033 AFM002 not_covered primary not fire 
120034 A9092 not_covered primary not fire 
120035 FS1476 not_covered primary not fire 
120036 FS1476 not_covered primary not fire 
120037 007881 not_covered neither not fire 
120038 007286 not_covered neither not fire 
120039 A010 not_covered neither not fire 
120041 N5012 not_covered neither not fire 
120042 FS1478  covered primary  fire 
120043 FS1478  covered primary  fire 
120044 A2075  covered primary not fire 
120045 136492  covered primary not fire 

UPDATE:

рекомендация от EdChum работал, когда я | вместо &

df3['fire_final'] = np.where((df3['mr_no'].isin(mr)) | (df3['fire1'] == 'covered') | (df3['fire2'].isin(['primary','secondary'])), 'fire', 'not fire') 

получения желаемых результатов:

  mr_no  fire1  fire2 fire_final 
120062 FS0937 not_covered secondary  fire 
120063 FS0937 not_covered secondary  fire 
120064 FS0900 not_covered secondary  fire 
120066 FS2037  covered primary  fire 
120067 A9090 not_covered neither not fire 
120068 129440  covered neither  fire 
120069 FS1629  covered primary  fire 
120070 FS2037  covered primary  fire 
120071 FS2037  covered primary  fire 
120072 A9074 not_covered neither not fire 
120073 ABE102 not_covered neither not fire 
120074 ABE100 not_covered neither not fire 
120075 A5125 not_covered neither not fire 
120076 199424 not_covered neither not fire 
120077 179873 not_covered neither not fire 
120078 A021 not_covered neither not fire 
120079 A022 not_covered neither not fire 
120080 A022 not_covered neither not fire 
120081 A022 not_covered neither not fire 
+3

Думаю, вам могут понадобиться 'и' и 'или' вместо' + 'и' | '. Те не делают то, что вы, кажется, думаете, что они делают. –

+0

Я сделал что-то подобное в прошлом и работал как шарм: def label_race (строка): if row ['eri_hispanic'] == 1: return 'Hispanic' if row ['eri_afr_amer'] + row ['eri_asian] '] + row [' eri_hawaiian '] + row [' eri_nat_amer '] + row [' eri_white ']> 1: return' Two or More ' – david

+0

Разница в том, что у меня есть несколько критериев в состоянии. Я попробовал .isin вместо ==, но это дало мне ошибку. – david

ответ

1

Я считаю, что вы можете сделать это в одной гильзе с помощью np.where:

In [6]: 
mr = ["A5115","133158","FS2114","FS2110","FS2115","FS2111","FS2149","FS2150","FS2017","FS2018"] 
df['fire_final'] = np.where((df['mr_no'].isin(mr)) & (df['fire1'] == 'covered') & (df['fire2'].isin(['primary','secondary'])), 'fire', 'not fire') 
df 

Out[6]: 
    mr_no  fire1 fire2 fire_final 
0 A5155  covered primary not fire 
1 FS2328  covered neither not fire 
3 133158 not_covered primary not fire 
4 FS2328 not_covered neither not fire 
5 A5128 not_covered neither not fire 
6 A5128 not_covered neither not fire 
7 133158  covered primary  fire 
8 133158 not_covered neither not fire 
9 A5128 not_covered neither not fire 
10 A5129 not_covered neither not fire 

было неясно, что вы действительно хотели, но вы хотите для возврата true, если какое-либо условие истинно, то вам необходимо или условия:

df['fire_final'] = np.where((df['mr_no'].isin(mr)) | (df['fire1'] == 'covered') | (df['fire2'].isin(['primary','secondary'])), 'fire', 'not fire') 

Somethings отметить, для массивов необходимо использовать операторы побитового &, |, ~ для and, or и not соответственно это происходит потому, что здесь мы сравниваем массив с некоторым логическим условием, и мы хотим массив булевых вернувшиеся. Для нескольких условий вам необходимо заключить условия в () из-за приоритета оператора.

+1

Итак, вы хотите или все условия? В этом случае замените & на | – EdChum

+0

Это работало: df ['fire_final'] = np.where ((df ['mr_no']. Isin (mr)) | (df ['fire1'] == 'coated') | (df ['fire2'] .isin (['primary', 'secondary'])), 'fire', 'not fire') спасибо EdChum! Отлично! – david

2

Python не C++, ни С. В результате, он использует несколько различных структур.

В вашем случае, когда вы хотите if заявления огня, когда thing1 верно илиthing2 верно, вы используете or не |.

В Python | выполняет поразрядные операции or.

Так что вы хотите что-то вроде этого:

if (something) or (something): 
    return 'fired' 
+0

@LOLKAT, эти '' 's являются как-то комбинацией' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Вот почему я упомянул использование C и Python '|'. – ForceBru