2013-10-25 4 views
2

У меня есть два фрагмента кода pandas, которые, как я думаю, должны быть эквивалентными, а второй не выполняет то, что я ожидаю.Использование логических операторов в построении Pandas DataFrame

# snippet 1 
    data = all_data[[((np.isfinite(all_data[self.design_metric][i]) 
        and all_data['Source'][i] == 2)) 
        or ((np.isfinite(all_data[self.actual_metric][i]) 
        and all_data['Source'][i] != 2)) 
        for i in range(len(all_data))]] 


# snippet 2 
    data = all_data[(all_data['Source'] == 2 & 
        np.isfinite(all_data[self.design_metric])) | 
        (all_data['Source'] != 2 & 
        np.isfinite(all_data[self.actual_metric]))] 

Каждый раздел (например, all_data['Source'] == 2) делает то, что я ожидаю от своего собственного, но, кажется, что я делаю что-то неправильно с логическими операторами, как конечный результат выходят с другим результатом до версии списка понимания ,

ответ

8

Оператор & связывается более плотно, чем == (или любой оператор сравнения). См. the documentation. Более простой пример:

>>> 2 == 2 & 3 == 3 
False 

Это потому, что она группируется, как 2 == (2 & 3) == 3, а затем сравнение цепочки вызывается. Это то, что происходит в вашем случае. Вам нужно поставить круглые скобки вокруг каждого сравнения.

data = all_data[((all_data['Source'] == 2) & 
       np.isfinite(all_data[self.design_metric])) | 
       ((all_data['Source'] != 2) & 
       np.isfinite(all_data[self.actual_metric]))] 

Примечание дополнительные круглые скобки вокруг == и != сравнений.

1

Наряду с приоритетом существует разница между операторами AND и &, первая из которых является логической, а вторая является бинарной побитовой. Кроме того, вы должны знать о выражениях boolead.

Смотрите примеры в следующем фрагменте:

логические выражения

>>> 1 and 2 
1 

>>> '1' and '2' 
'1' 

>>> 0 == 1 and 2 == 0 or 0 
0 

битовые операторы

>>> 1 & 2 
0 

>>> '1' & '2' 
Traceback (most recent call last): 
    ... 
TypeError: unsupported operand type(s) for &: 'str' and 'str' 

>>> 0 == 1 & 2 == 0 | 0 
True 
Смежные вопросы