我有一个包含一列的数据框,我试图用函数遍历该列的每一行,并将值放入新列中。所以首先我尝试在单个字符串上运行我的正则表达式以确保我得到我期望的结果:
# Importing dependencies
import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
import re
# Test the pattern on a s string
s = "64\"X36\"X60\" STACKED STONE AREAWELL BOMAN KEMP"
z = re.search(r"((\d*[\.|-]?\d+(\/\d*)?)\s*((?:cms?
|in|inch|inches|mms?)\b|(?:[\"|\'|\”])|\s?)\s*
[x|X]\s*){0,2}(\d*[\.|-]?\d+(\/\d*)?)\s*((?:cms?
|in|inch|inches|mms?)\b|(?:[\"|\'|\”])|\s?)" , s,
flags=re.I)
print(z.group(0))
我的结果是 64"X36"X60" 这正是我想要得到的。但是,当我以数据框上的函数形式应用它时:
def patterns(row):
return re.search(r"((\d*[\.|-]?\d+(\/\d*)?)\s*
((?:cms?|in|inch|inches|mms?)\b|(?:
[\"|\'|\”])|\s?)\s*[x|X]\s*){0,2}(\d*[\.|-]?\d+
(\/\d*)?)\s*((?:cms?|in|inch|inches|mms?)\b|(?:
[\"|\'|\”])|\s?)", row["Description"],
flags=re.I)
# Apply the function to each row
df["Dimensions"] = df.apply(patterns, axis=1)
我得到的结果格式如下:
re.Match object; span=(0, 11), match='52"X36"X72"'
所以我认为我没有正确构建我的功能。在我添加的示例测试中
print(z.group(0))
它仅从匹配元素中读取数据,这正是我所需要的。任何人都可以指出我如何调整函数以使每一行都得到相同的结果?
我尝试在函数的末尾添加 .group(0) ,但这是我执行它后得到的错误:
df["Dimensions"] = df.apply(patterns, axis=1)
抛出错误是因为re.search
返回 None,导致该行中没有匹配的字符串。如果未找到字符串,请尝试添加条件以某种方式返回其他内容,如果未找到字符串,下面的代码将返回“无”。
def patterns(row):
s = re.search(r"((\d*[\.|-]?\d+(\/\d*)?)\s*
((?:cms?|in|inch|inches|mms?)\b|(?:
[\"|\'|\”])|\s?)\s*[x|X]\s*){0,2}(\d*[\.|-]?\d+
(\/\d*)?)\s*((?:cms?|in|inch|inches|mms?)\b|(?:
[\"|\'|\”])|\s?)", row["Description"],
flags=re.I)
return s.group(0) if s else "None"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句