2016-02-11 4 views
3

У меня есть dF, длина которого превышает 100 тыс. Строк, а несколько колонок - ничего сумасшедшего. Я пытаюсь подмножить строки на основе списка из 4000 строк, но я стараюсь выяснить, как это сделать. Есть ли способ подмножества, используя что-то вроде.Как подмножить кадр данных pandas на основе списка значений строк?

ФР выглядит что-то вроде этого

dog_name count 
=================== 
Jenny  2 
Fido   4 
Joey   7 
Yeller  2 

и список строк содержится в переменной dog_name_list=['Fido', 'Yeller']

Я пытался что-то вдоль линий df[df['dog_name'].isin(dog_name_list), но я получаю забавную ошибку: unhashable type: 'list'

Я проверил similar question, на docs и this изношенный для Подмените данные кадры, увидев, присутствует ли значение в списке, но это меня не касается нигде, и я немного смущен тем, что мне не хватает. Был бы очень признателен за чей-то совет!

+0

Проверьте, есть ли какие-либо списки в столбце 'dog_name':' any ((isinstance (v, list) для v в df.dog_name)) ' – Alexander

+0

Ваша команда верна, вероятно, проблема с данными, как указывает Александр. –

ответ

3

Я считаю, что у вас есть список в вашей колонке с названием собаки.

Это прекрасно работает:

>>> df[df['dog_name'].isin(['Fido', 'Yeller'])] 
    dog_name count 
1  Fido  4 
3 Yeller  2 

Но если добавить список:

df.ix[4] = (['a'], 2) 
>>> df 
    dog_name count 
0 Jenny  2 
1  Fido  4 
2  Joey  7 
3 Yeller  2 
4  [a]  2 

>>> df[df['dog_name'].isin(['Fido', 'Yeller'])] 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-20-1b68dd948f39> in <module>() 
----> 1 df[df['dog_name'].isin(['Fido', 'Yeller'])] 
... 
pandas/lib.pyx in pandas.lib.ismember (pandas/lib.c:5014)() 

TypeError: unhashable type: 'list' 

Чтобы найти те плохие собака:

>>> df[[isinstance(dog, list) for dog in df.dog_name]] 
    dog_name count 
4  [a]  2 

Чтобы найти все типы данных в колонка:

>>> set((type(dog) for dog in df.dog_name)) 
{list, str} 
+0

Хм, это действительно странно. @Alexander, как ни странно, 'any ((isinstance (v, list) для v в df.dog_name))' возвращает 'false' – scrollex

+1

Постарайтесь, чтобы все данные были следующими:' all ((isinstance (dog, str) для собаки в df.dog_name)) ' – Alexander

+0

Отлично, спасибо! – scrollex

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