2016-06-03 2 views
3

Я хотел бросить все строки, которые не находятся в списке в панд DataFrameпадение ряда панды со списком аргументов

Например, рассмотрим этот dataframe:

data = {'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 
    'year': [2012, 2012, 2013, 2014, 2014], 
    'reports': [4, 24, 31, 2, 3]} 
df = pd.DataFrame(data, index = ['Cochice', 'Pima', 'Santa   Cruz', 'Maricopa', 'Yuma']) 
df 

уронить строку по названию легко:

df = df[df.name != 'Tina'] # to drop the row which include Tina in the name column 

Но если я хочу сохранить только строку Джейсон и Молли:

List=['Jason', 'Molly'] 
df = df[df.name not in List] 

не работает!

ответ

5

Использование isin и передать список как арг и инвертировать условие с использованием ~:

In [58]: 
names = ['Jason', 'Molly'] 
df[~df['name'].isin(names)] 

Out[58]: 
        name reports year 
Santa   Cruz Tina  31 2013 
Maricopa   Jake  2 2014 
Yuma     Amy  3 2014 
+0

Новый SO упорядоченность ответов по времени своего рода устраняет неоднозначность я думаю – EdChum

+0

@jezrael это уже было реализовано в течение нескольких недель, если вы посмотрите все старые ответы, вы увидите, что принятое Ответ не обязательно является первым упорядоченным ответом или первым заказываемым ответом, все ответы теперь упорядочены по времени – EdChum

+0

Привет. Не могли бы вы объяснить, что означает «~»? – Coolpix

2

Использование isin с инвертированием булево маску ~. Я думаю, что лучше использовать другое название списка как List, например. l или names, как использование EdChum:

List=['Jason', 'Molly'] 
df = df[~df.name.isin(List)] 

l=['Jason', 'Molly'] 
df = df[~df.name.isin(l)] 

print (df) 
        name reports year 
Santa   Cruz Tina  31 2013 
Maricopa   Jake  2 2014 
Yuma     Amy  3 2014 

Объяснение:

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

print (df['name'].isin(l)) 
Cochice    True 
Pima     True 
Santa   Cruz False 
Maricopa    False 
Yuma     False 
Name: name, dtype: bool 

print (~df['name'].isin(l)) 
Cochice    False 
Pima     False 
Santa   Cruz  True 
Maricopa    True 
Yuma     True 
Name: name, dtype: bool 
+0

. Попробуйте объяснить больше' ~ ', см. Обновление. Также вы можете проверить этот [post] (http://stackoverflow.com/questions/15998188/how-can-i-obtain-the-element-wise-logical-not-of-a-pandas-series). – jezrael

+0

Спасибо, я проверю ваше сообщение :) – Coolpix

+0

Btw, это интересный феномен в SO - я думаю, что наш ответ почти равен, но один (высоко) вверх, а другой нет. Хммм, это интересно. ;) – jezrael

0

isin велик. Другой способ использования query будет

In [821]: List = ['Jason', 'Molly'] 

In [822]: df.query('name not in @List') 
Out[822]: 
        name reports year 
Santa   Cruz Tina  31 2013 
Maricopa   Jake  2 2014 
Yuma     Amy  3 2014 
Смежные вопросы