2015-11-06 3 views
0

Мне необходимо проанализировать данные, используя следующие операции.Фильтр DataFrame объекта dtype с использованием pandas

data=[{'a': 1, 
     'b': {1: 1, 
      2: 2}, 
     'c': ['q', 'w', 'e', 'r', 't', 'y']}, 
     {'a': 2, 
     'b': {1: 2, 
      2: 3}, 
     'c': ['q', 't', 'a', 'v', 'o', 'l']}] 

df = pd.DataFrame(data) 

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

print(df['q' in df.c].head()) 

Однако я получаю сообщение об ошибке:

File "pandas/hashtable.pyx", line 676, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12216) 
KeyError: False 

Почему бы не эта работа?

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

print(df[df.a == 1].head()) 

ответ

0

Вы можете использовать apply на колонке, чтобы сформировать булеву маску, описывающую нужные столбцы, а затем фильтровать DataFrame этой маской:

>>> df[df.c.apply(lambda val: 'q' in val)] 
    a    b     c 
0 1 {1: 1, 2: 2} [q, w, e, r, t, y] 
1 2 {1: 2, 2: 3} [q, t, a, v, o, l] 
+0

Спасибо. Но могу ли я использовать этот метод для тех же самых нескольких значений, например, «q» и «t»? – pheno

+0

вы можете использовать '' 'q 'в val или' t 'в val'' – jakevdp

1

in используется для проверки индексов. Для значений вы можете использовать str.contains():

df.c.str.contains("q", regex=False) 
+0

Спасибо за ответ в любом случае! – pheno

+0

Это не сработает, так как col c содержит списки как элементы – EdChum

+0

@EdChum, он работает, потому что содержит использование 'in', когда' regex' '' False'. – HYRY