2017-02-03 4 views
1

У меня проблема с pandas 19.2, дающая мне результат, который я ожидаю. Столбцы a-g имеют ['да', 'нет', '', NaN]. Если какой-либо из этих столбцов имеет «да», я хочу вернуть строку (другие столбцы не показаны). Вот мой код.Pandas логическая операция

xdf2 = xdf[((xdf['a'] == 'yes').all() or 
        (xdf['b'] == 'yes').all() or 
        (xdf['c'] == 'yes').all() or 
        (xdf['d'] == 'yes').all() or 
        (xdf['e'] == 'yes').all() or 
        (xdf['f'] == 'yes').all() or 
        (xdf['g'] =='yes').all()) ] 

Это дает мне следующее сообщение об ошибке:

2134     return self._engine.get_loc(key) 
    2135    except KeyError: 
-> 2136     return self._engine.get_loc(self._maybe_cast_indexer(key)) 
    2137 
    2138   indexer = self.get_indexer([key], method=method, tolerance=tolerance) 

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4433)() 

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4279)() 

pandas\src\hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:13742)() 

pandas\src\hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.get_item (pandas\hashtable.c:13696)() 

KeyError: False 

Без '.all' Я получаю

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Это кажется простым и общим фрагмент кода, но я гавань» t нашел хороший пример. Что мне не хватает?

+1

А простой xdf2 = XDF [(XDF [ 'а'] == 'да') | (xdf ['b'] == 'да') | (xdf ['c'] == 'да') | (xdf ['d'] == 'yes')] будет работать. Оператор или оператор | – Vaishali

ответ

5

Попробуйте

xdf[xdf[list('abcdefg')].eq('yes').any(1)] 
+0

Не знал о .eq() +1! – Vaishali

+0

'xdf [xdf.ix [:, 'a': 'g']. Eq ('yes'). Any (1)]'; чуть более компактный. – Abdou

+0

Заголовки были упрощены. Окончательный код был разработан для: xdf [xdf [list (xdf.filter (regex = 'pii *'))]. Eq ('yes'). Any (1)]. To_csv ('pii.csv') Спасибо за помощь! – Harvey

0

Следующая должно работать:

import pandas as pd 

a = [["yes", "no", "yes", "yes"], 
    ["yes", "yes", "no", "yes"], 
    ["yes", "no", "yes", "yes"]] 
xdf = pd.DataFrame(a, columns=["a", "b", "c", "d"])  
print xdf 

boollist = [ (xdf[col] == "yes").all() for col in xdf.columns ] 
xdf2 = xdf[xdf.columns[boollist] ] 
print xdf2 
Смежные вопросы