2016-12-20 3 views
3

Спасибо за чтение. Извинения за то, что я уверен, - это простая проблема для ответа.Как реализовать фильтр Pandas GroupBy для данных смешанного типа?

У меня есть dataframe:

df: 
    Entry Found 
0 Dog  [1,0] 
1 Sheep [0,1] 
2 Cow  "No Match" 
3 Goat  "No Match" 

Я хочу вернуть новый dataframe, который содержит только записи, которые содержат No Match в Found колонке (и сохранить их индекс порядка), а именно:

Выход:

Entry Found 
0 Cow  "No Match" 
1 Goat  "No Match" 

я знаю, чтобы сделать это, я должен использовать встроенный в панд GroupBy() и filter() функций. По этим вопросам (Filter data with groupby in pandas) и (Pandas: DataFrame filtering using groupby and a function) Я пробовал:

>> df.groupby('Found','Entry').filter(lambda x: type(x) == str) 
>> No axis named Entry for object type <class 'pandas.core.frame.DataFrame'> 

и:

>> df.groupby('Found').filter(lambda x: type(x) == str) 
>> TypeError: unhashable type: 'list' 

Может кто-нибудь сказать мне, что я делаю неправильно?

+0

Вы можете просто отфильтровать df перед группировкой: 'df ['Found'] == 'No Match']', если это не работает, вам нужно действительно подумать о том, почему вы хотите хранить списки в a df в первую очередь, поскольку он плохо подходит для панд – EdChum

+0

@EdChum Я ценю ваш откровенный ответ. Я согласен, что хранение списка было нецелесообразным (это была беспорядочная работа для более ранней проблемы - другое исправление может быть в порядке). Написание вашего 'df [df ['Found'] == 'No match']' ** не ** возвратил мне пустой фреймворк. (Оказывается, это на самом деле '' No Match '', а не' 'No match" ' – Chuck

+0

@EdChum Man, Это именно то, что мне нужно ... Если бы я написал' new_df = df [df [' Found '] == 'No Match'] 'будет возвращать совершенно новый DataFrame, с которым я мог бы работать независимо, или это будет копия, где бы я менял исходный df, также изменился бы df_new? – Chuck

ответ

3

Вместо того, чтобы использовать функцию groupby, вы можете вызвать такие запросы, как:

df = df[df["Found"] == "No Match"] 

Таким образом, он будет искать колонку Found если есть "No Match", которые будут False когда это список, а ошибки.

Смежные вопросы