Удалить все строки, которые соответствуют условию регулярного выражения - PullRequest
0 голосов
/ 08 сентября 2018

пытается научить себя пандам .. и играет с разными типами

У меня есть df следующим образом

df = pd.DataFrame({'ID':[0,2,"bike","cake"], 'Course':['Test','Math','Store','History'] })
print(df)
    ID  Course
0   0   Test
1   2   Math
2   bike    Store
3   cake    History

dtype ID - это, конечно, объект. То, что я хочу сделать, это удалить все строки в DF, если идентификатор содержит строку.

Я думал, что это будет так же просто, как ..

df.ID.filter(regex='[\w]*')

но это всё возвращает, есть ли верный метод огня для таких вещей?

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Другой вариант - преобразовать столбец в строку и использовать str.match:

print(df[df['ID'].astype(str).str.match("\d+")])
#  Course ID
#0   Test  0
#1   Math  2

Ваш код не работает, потому что, как указано в документации для pandas.DataFrame.filter:

Обратите внимание, что эта процедура не фильтрует фрейм данных по его содержимому. Фильтр применяется к меткам индекса.

0 голосов
/ 08 сентября 2018

Ответ Вэнь - правильный (и самый быстрый) способ решить эту проблему, но чтобы объяснить, почему ваше регулярное выражение не работает, вы должны понять, что означает \w.

\w соответствует любому символу слова, включая [a-zA-Z0-9_]. То, что вы в настоящее время соответствует включает в себя цифр, так что все соответствует. Допустимый подход регулярного выражения:

df.loc[df.ID.astype(str).str.match(r'\d+')]

  ID Course
0  0   Test
1  2   Math

Второй проблемой является использование filter. Он не фильтрует вашу строку ID, а фильтрует ваш индекс. Допустимое решение с использованием filter будет выглядеть следующим образом:

df.set_index('ID').filter(regex=r'^\d+$', axis=0)

   Course
ID
0    Test
2    Math
0 голосов
/ 08 сентября 2018

Вы можете использовать to_numeric

df[pd.to_numeric(df.ID,errors='coerce').notnull()]
Out[450]: 
  Course ID
0   Test  0
1   Math  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...