Как использовать регулярное выражение в mutate dplython для добавления нового столбца

#python #pandas

#python #панды

Вопрос:

Зная R и dplyr, я пытался выполнить одну из своих задач на python, используя dplython и pandas .

Я пытаюсь создать новый столбец во фрейме данных, который оценивает столбец с использованием регулярного выражения, и при сопоставлении с шаблоном я даю значение = 1, иначе 0.

 import dplython as dp 
import pandas as pd 
import re

a = {'module_name':'eventOutput','module_tpye':'export'}
b = {'module_name':'session','module_tpye':'export'}
df = pd.DataFrame()
master_data = (a,b)
new_df = df.from_dict(master_data)
dp_new_df = dp.DplyFrame(new_df)
dp_new_df = dp_new_df >> dp.mutate(
  to_select=(
    1 
    if bool(re.match(r"(.*)Output(.*)",dp.X.module_name)) 
    else 0
  )
)
  

Получение ошибки как TypeError: expected string or bytes-like object

Ожидаемый результат:

 module_name  module_tpye    to_select
0  eventOutput      export          1
1      session      export          0
  

Спасибо от :
Парень с большими надеждами на python

Комментарии:

1. выведите dp_new_df перед mutate() . Прокомментируйте последнюю строку, чтобы увидеть, где она прерывается.

2. Я упомянул об ошибке, это связано с регулярным выражением . Если я удалю регулярное выражение, оно сработает.

3. dp.X.module_name правильно?

4. ДА. Это правильно

5. Вы пытаетесь сопоставить module_name со строкой output(.*) ?

Ответ №1:

Вот решение, которое не использует dplython, с которым я не знаком

 import pandas as pd
import re

a={'module_name':'eventOutput','module_tpye':'export'}
b={'module_name':'session','module_tpye':'export'}
df = pd.DataFrame()
master_data = (a,b)
new_df = df.from_dict(master_data)
new_df["to_select"] = [bool(re.match(r"(.*)Output(.*)",x)) for x in new_df["module_name"]]
  

Ответ №2:

Я написал пакет datar для переноса dplyr и семейств на python. Теперь вы можете сделать это, используя (почти) тот же синтаксис, что и в R:

 >>> from datar.all import f, tibble, mutate, if_else, grepl
>>> df = tibble(
...     module_name=['eventOutput', 'session'], 
...     module_type=['export']
... )
>>> df
   module_name module_type
      <object>    <object>
0  eventOutput      export
1      session      export
>>> 
>>> df >> mutate(
...     to_select=if_else(grepl("Output", f.module_name), 1, 0)
... )
   module_name module_type  to_select
      <object>    <object>    <int64>
0  eventOutput      export          1
1      session      export          0