我的数据框中有一些列(约 200 万行),如下所示:
column
1/20/1"ADAF"
1/4/551BSSS
1/2/1AAAA
1/565/1 "AAA="
我只想提取:
1/20/1
1/4/551
1/2/1
1/565/1
我尝试过:
df['wanted_column'] = df['column'].str.extract(r'((\d+)/(\d+)/(\d+))', expand=True)
但是我得到了一个错误:
ValueError: Wrong number of items passed 4, placement implies 1
谁知道我哪里错了?如果有更好更快的解决方案,我将不胜感激。
提前致谢。
最佳答案
如果您想将字符串的单个部分提取到单个列中,请确保您的正则表达式仅包含单个捕获组。删除所有其他捕获组(如果它们是冗余的)或将它们转换为非捕获组(如果它们用作模式序列的简单分组,例如 (\W+\w+){0,3}
-> (?:\W+\w+){0,3}
)。
在这里,您可以使用
df['wanted_column'] = df['column'].str.extract(r'(\d+/\d+/\d+)', expand=True)
重点是,当您将其与 str.extract
一起使用时,仅在正则表达式中使用单个捕获组将值提取到单个列中。
请注意r'((\d+)/(\d+)/(\d+))'
也可以重写为 r'((?:\d+)/(?:\d+)/(?:\d+))'
对于此用例,但这些非捕获组将是多余的,因为它们仅对单个 \d+
进行分组他们每个人都有模式,这没有意义。
如果您需要将值提取到多列中,请注意列数应等于模式中捕获组的数量,例如
df[['Val1', 'Val2', 'Val3']] = df['column'].str.extract(r'(\d+)/(\d+)/(\d+)', expand=True)
# 1 2 3 ^ 1 ^ ^ 2 ^ ^ 3 ^
关于python - 通过 4 的项目数量错误,使用正则表达式提取时放置意味着 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52802425/