Используйте регулярные выражения для удаления / исключения столбцов из фрейма данных - Python - PullRequest
0 голосов
/ 28 июня 2019

У меня есть датафрейм, который можно сгенерировать из кода ниже

    df = pd.DataFrame({'person_id' :[1,2,3],'date1': ['12/31/2007','11/25/2009','10/06/2005'],'date1derived':[0,0,0],'val1':[2,4,6],'date2': ['12/31/2017','11/25/2019','10/06/2015'],'date2derived':[0,0,0],'val2':[1,3,5],'date3':['12/31/2027','11/25/2029','10/06/2025'],'date3derived':[0,0,0],'val3':[7,9,11]})

Фрейм данных выглядит так, как показано ниже

enter image description here

Я хотел бы удалить столбцы, содержащие в своем имени слова «производные». Я попробовал другое регулярное выражение, но не смог получить ожидаемый результат.

    df = df.filter(regex='[^H\dDerived]+', axis=1)
    df = df.filter(regex='[^Derived]',axis=1)

Можете ли вы дать мне знать правильное регулярное выражение, чтобы сделать это?

Ответы [ 5 ]

1 голос
/ 28 июня 2019

В последних версиях панд вы можете использовать строковые методы для индекса и столбцов.Здесь str.endswith выглядит как хорошая подгонка.

import pandas as pd

df = pd.DataFrame({'person_id' :[1,2,3],'date1': ['12/31/2007','11/25/2009','10/06/2005'],
                   'date1derived':[0,0,0],'val1':[2,4,6],'date2': ['12/31/2017','11/25/2019','10/06/2015'],
                   'date2derived':[0,0,0],'val2':[1,3,5],'date3':['12/31/2027','11/25/2029','10/06/2025'],
                   'date3derived':[0,0,0],'val3':[7,9,11]})

df = df.loc[:,~df.columns.str.endswith('derived')]

print(df)

O / P:

   person_id       date1  val1       date2  val2       date3  val3
0          1  12/31/2007     2  12/31/2017     1  12/31/2027     7
1          2  11/25/2009     4  11/25/2019     3  11/25/2029     9
2          3  10/06/2005     6  10/06/2015     5  10/06/2025    11
1 голос
/ 28 июня 2019

pd.Index.difference() с df.filter()

df[df.columns.difference(df.filter(like='derived').columns,sort=False)]

   person_id       date1  val1       date2  val2       date3  val3
0          1  12/31/2007     2  12/31/2017     1  12/31/2027     7
1          2  11/25/2009     4  11/25/2019     3  11/25/2029     9
2          3  10/06/2005     6  10/06/2015     5  10/06/2025    11
1 голос
/ 28 июня 2019

Вы можете использовать отрицательный прогноз нулевой ширины, чтобы убедиться, что строка derived никуда не приходит:

^(?!.*?derived)
  • ^ соответствует началу строки
  • (?!.*?derived) - это шаблон с отрицательным прогнозом, который гарантирует, что derived не входит в строку

Ваш шаблон [^Derived] будет соответствовать любому отдельному символу, не принадлежащему D / e /R / I / V / E / D.

1 голос
/ 28 июня 2019

IIUC, вы хотите удалить столбцы с derived. Это должно сделать:

df.drop(df.filter(like='derived').columns, 1)

Out[455]:
   person_id       date1  val1       date2  val2       date3  val3
0          1  12/31/2007     2  12/31/2017     1  12/31/2027     7
1          2  11/25/2009     4  11/25/2019     3  11/25/2029     9
2          3  10/06/2005     6  10/06/2015     5  10/06/2025    11
1 голос
/ 28 июня 2019
df[[c for c in df.columns if 'derived' not in c ]]

выход

   person_id       date1  val1       date2  val2       date3  val3
0          1  12/31/2007     2  12/31/2017     1  12/31/2027     7
1          2  11/25/2009     4  11/25/2019     3  11/25/2029     9
2          3  10/06/2005     6  10/06/2015     5  10/06/2025    11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...