#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. Спасибо вам за вашу помощь.