我的数据框只有一列,我试图用函数遍历该列的每一行,并在新列中添加值。 因此,首先,我尝试在单个字符串上运行我的正则表达式,以确保获得期望的结果:
# 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))
它仅从match元素读取数据,这正是我所需要的。任何人都可以指出我如何对函数进行调整,以便为每一行提供相同的结果?
我尝试在函数末尾添加.group(0),但这是我执行以下命令后得到的错误:
df["Dimensions"] = df.apply(patterns, axis=1)
答案 0 :(得分:1)
由于re.search
返回None引发了错误,原因是该行中没有匹配的字符串。如果找不到字符串,请尝试添加条件以某种方式返回其他内容,如果找不到字符串,则下面的代码将返回“ 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"