2016-07-07 2 views
0

В настоящее время я использую Pandas в python 2.7. Моя dataframe выглядит примерно так:python pandas фильтрация с участием списков

>>> df 
     0 
1 [1, 2] 
2 [2, 3] 
3 [4, 5] 

Можно ли отфильтровать строки по значениям в колонке 1? Например, если мое значение фильтра равно 2, фильтр должен вернуть фрейм данных, содержащий первые две строки.

Я уже пробовал пару способов. Самое лучшее, что я могу придумать, - это сделать представление списка, которое возвращает индекс строк, в которых существует значение. Затем я мог бы фильтровать dataframe со списком индексов. Но это будет очень медленным, если я хочу фильтровать несколько раз с разными значениями. В идеале я хотел бы что-то, что использует функцию сборки в функциях Pandas, чтобы ускорить процесс.

+0

Вы можете использовать 'np.in1d', как показано в ответ на: [» Поиск расположения элементов массива в столбце кадра pandas (aka pd.series) '] (http://stackoverflow.com/questions/38083227/finding-an-array-elements-location-in-a-pandas-frame-column -aka-pd-series) для поиска нескольких значений. – Divakar

ответ

2

Вы можете использовать boolean indexing:

import pandas as pd 

df = pd.DataFrame({'0':[[1, 2],[2, 3], [4, 5]]}) 
print (df) 
     0 
0 [1, 2] 
1 [2, 3] 
2 [4, 5] 

print (df['0'].apply(lambda x: 2 in x)) 
0  True 
1  True 
2 False 
Name: 0, dtype: bool 

print (df[df['0'].apply(lambda x: 2 in x)]) 
     0 
0 [1, 2] 
1 [2, 3] 
+0

Удивительный! Спасибо за помощь. Это работает намного быстрее, чем у меня. Я думал, что будет ответ, который будет похож на df [2 в df [0]]. – darkyoda182

1

Вы также можете использовать логическое индексирование со списком понимания:

>>> df[[2 in row for row in df['0']]] 
     0 
0 [1, 2] 
1 [2, 3] 
Смежные вопросы