Применение функции с регулярным выражением к фрейму данных pandas

#python #regex #pandas

Вопрос:

У меня есть следующая выдержка из фрейма данных df[2]:

     CAR DRIVER START   PIT 1    PIT 2     PIT 3     PIT 4     PIT 5
0    31    OCO    In  In (2)  C3n (3)  C2n (37)         0         0
1     5    VET    In  In (2)  C3n (3)  C2n (36)         0         0
2    44    HAM    In  In (2)  C3u (4)  C2n (19)  C3n (47)         0
3    55    SAI    In  In (2)  C3n (3)  C2n (32)         0         0
4    14    ALO    In  In (2)  C3n (3)  C2n (39)         0         0
 

Я пытаюсь изменить значения столбцов «ЯМА..» (3-й столбец и далее, путем проверки), например, с «C3n (3)» на «C3n-3». Для этого я написал следующий код:

 df[2].iloc[:, 3:] = df[2].iloc[:, 3:].apply(lambda x: re.compile(r'w ').findall(str(x))
              [0]   "-"   re.compile(r'w ').findall(str(x))[1] if len(str(x)) > 1 else 0)
 

Вывод из следующего кода является:

     CAR DRIVER START PIT 1  PIT 2  PIT 3 PIT 4 PIT 5
0    31    OCO    In  0-In  0-C3n  0-C2n   0-0   0-0
1     5    VET    In  0-In  0-C3n  0-C2n   0-0   0-0
2    44    HAM    In  0-In  0-C3n  0-C2n   0-0   0-0
3    55    SAI    In  0-In  0-C3n  0-C2n   0-0   0-0
4    14    ALO    In  0-In  0-C3n  0-C2n   0-0   0-0
 

,что неверно, так как все значения столбцов одинаковы. Регулярное выражение, которое я реализовал в лямбде, корректно при тестировании как независимой функции, но не при применении его к фрейму данных.

Это проблема с нарезкой моего фрейма данных, так как это единственная проблема, в которой я не уверен? Любая помощь будет признательна.

Ответ №1:

Вы можете использовать filter для выбора PIT.. столбцов и замены следующим образом:

 >>> df.filter(like='PIT').replace(r' ((d ))', r'-1', regex=True)

  PIT 1  PIT 2   PIT 3   PIT 4  PIT 5
0  In-2  C3n-3  C2n-37       0      0
1  In-2  C3n-3  C2n-36       0      0
2  In-2  C3u-4  C2n-19  C3n-47      0
3  In-2  C3n-3  C2n-32       0      0
4  In-2  C3n-3  C2n-39       0      0
 

Для регулярного выражения обратитесь к документации по (d ) и 1

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

1. Спасибо вам за вашу помощь.