Pandas full Dataframe Применить к функции регулярного выражения выдает ошибку: TypeError: «ожидаемая строка или байтовоподобный объект» - PullRequest
0 голосов
/ 16 мая 2018

Вот моя функция регулярных выражений:

def parse_repl(df_item):
    for pattern, replacement in d_comp.items():
        df_item = pattern.sub(replacement, df_item)
    return df_item

d_comp - это скомпилированный словарь элементов регулярных выражений для замены.

Я звоню так:

df.apply(parse_repl)
df.to_csv(...)

Я также пытался apply с axis=0 и axis=1, но ни один из них не работал.

ошибка такова:

TypeError: ('ожидаемая строка или байтовоподобный объект', 'произошла с индексом myField')

Ошибка в этой строке функции parse_repl:

df_item = pattern.sub(replacement, df_item)

Предположительно, потому что sub ожидает байтовый массив.

Вопрос в том, как я могу преобразовать df_item туда, где он будет работать в вызове sub, то есть изменить данные элемента, а затем вернуть изменения обратно в основной DF без изменений?

Спасибо!

1 Ответ

0 голосов
/ 17 мая 2018

Сначала я пытаюсь воспроизвести вашу проблему без приведенного примера.

import pandas as pd
import re

df = pd.DataFrame({'x': ['a', 'b', 'c'], 'y': ['q', 'w', 'e']})

d_comp = {
    re.compile('a'): 'new_a',
    re.compile('q'): 'new_q',
}

def parse_repl(df_item):
    for pattern, replacement in d_comp.items():
        df_item = pattern.sub(replacement, df_item)
    return df_item

df.apply(parse_repl)

При использовании df.apply переданная в него функция должна воспринимать последовательность как аргумент pattern.sub(replacement, df_item) не будет работать, так как df_item здесь не является ни строкой, ни байтом, это серия.

Вы можете попробовать исправить parse_repl для достижения своей цели, но я рекомендую использовать что-то вроде ниже

In [1]:     import pandas as pd
   ...:     from IPython.display import display
   ...: 
   ...:     df = pd.DataFrame({'x': ['a', 'b', 'c'], 'y': ['q', 'w', 'e']})
   ...:     display('Original')
   ...:     display(df)
   ...: 
   ...:     regex_to_replace = {
   ...:         'a': 'new_a',
   ...:         'q': 'new_q',
   ...:     }
   ...: 
   ...:     for column_name in df:
   ...:         column = df[column_name]
   ...:         for regex_patten, replacement in regex_to_replace.items():
   ...:             column = column.str.replace(regex_patten, replacement)
   ...: 
   ...:         df[column_name] = column
   ...: 
   ...:     display('Replaced')
   ...:     display(df)
   ...: 
   ...: 
'Original'
   x  y
0  a  q
1  b  w
2  c  e
'Replaced'
       x      y
0  new_a  new_q
1      b      w
2      c      e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...