#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