Замените значения в Pandas Dataframe регулярным выражением, если значение не содержит строку - PullRequest
0 голосов
/ 15 мая 2019

У меня довольно большой фрейм данных (около 15M строк в 7 столбцах), и я хотел бы заменить некоторые значения, которые не имеют правильной формы.

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

Мой столбец данных выглядит так:
1 : L8_P1_Local 2 : L8 3 : L8_P1_Local 4 : L8 5 : poste2 6 : poste6 7 : poste2 8 : Poste 2 9 : poste_6

РЕДАКТИРОВАТЬ: Иногда poste2 и poste6 отличаются как Poste 2 или poste_2 или Poste_2. Будет ли это регулярное выражение соответствовать всем?[pP] oste [\ s] * [_] * [0-9]

То, что я пытаюсь сделать, это как L8 на каждом ряду перед poste2 или poste6, так что это будет похоже наL8_poste6.У меня есть строка 'L8' в переменной с именем numline.

Редактировать: Поскольку ответ был в принятом ответе на комментарий, я опишу его здесь.

text = numligne +'_\\1' dataframe['row'] = dataframe['row'].str.replace('([pP]oste[ _]*[0-9])', text)

Ответы [ 3 ]

0 голосов
/ 15 мая 2019
Я думаю, для вас регистр текста не имеет значения.Пожалуйста, проверьте ниже решение.
s = pd.DataFrame({'ID':[1,2,3,4,5,6,7,8,9],
                     'Text':['L8_P1_Local','L8','L8_P1_Local','L8','poste2','poste6','poste2','Poste 2','poste_6']})


    def match_it(s):
        s['Text']=s['Text'].str.lower()
        s['Text']=s['Text'].str.replace(' ','')
        for i in range(len(s)):
            if 'poste' in s.loc[i,'Text']:
                s.loc[i,'Text']='l8'+'_'+s.loc[i,'Text']
        return s    

    match_it(s)
#Output



     ID  Text
    0   1   l8_p1_local
    1   2   l8
    2   3   l8_p1_local
    3   4   l8
    4   5   l8_poste2
    5   6   l8_poste6
    6   7   l8_poste2
    7   8   l8_poste2
    8   9   l8_poste_6
0 голосов
/ 15 мая 2019

Если вы хотите добавить L8, если его там нет, вы можете просто попросить панд сделать это:

Так что я буду считать, что у вас есть DataFrame (скажем, df) со столбцом (скажем,столбец), содержащий данные вашего примера:

           col
0  L8_P1_Local
1           L8
2  L8_P1_Local
3           L8
4       poste2
5       poste6
6       poste2

Вы можете сделать:

df.loc[~df.col.str.match('L8.*'),'col'] = df.loc[
    ~df.col.str.match('L8.*'), 'col'].str.replace('', 'L8_', 1)

, чтобы получить:

           col
0  L8_P1_Local
1           L8
2  L8_P1_Local
3           L8
4    L8_poste2
5    L8_poste6
6    L8_poste2
0 голосов
/ 15 мая 2019

Использование pd.Series.str.replace:

s = pd.Series(["1 : L8_P1_Local",
"2 : L8",
"3 : L8_P1_Local",
"4 : L8",
"5 : poste2",
"6 : poste6",
"7 : poste2",])
s.str.replace(' (poste[26])', 'L8_\\1')

Вывод:

0    1 : L8_P1_Local
1             2 : L8
2    3 : L8_P1_Local
3             4 : L8
4      5 : L8_poste2
5      6 : L8_poste6
6      7 : L8_poste2

Существует несколько способов реализовать это для всего кадра данных, включая (но, вероятно, не самый быстрый):

for c in df:
    df[c] = df[c].str.replace(' (poste[26])', 'L8_\\1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...