将带有正则表达式的函数应用于熊猫数据框
我有数据帧 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
我正在尝试更改 "PIT .." 列(从第 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
,这是不正确的,因为所有列值都相同。我在 lambda 中实现的正则表达式在作为独立函数进行测试时是正确的,但当我将其应用于数据帧时则不正确。
这是我的数据帧切片的问题,因为这是我不确定的唯一问题吗?任何帮助,将不胜感激。
回答
您可以使用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