Python-遍历熊猫数据帧中每一行的函数

时间:2019-01-25 12:52:43

标签: python regex pandas

我的数据框只有一列,我试图用函数遍历该列的每一行,并在新列中添加值。 因此,首先,我尝试在单个字符串上运行我的正则表达式,以确保获得期望的结果:

# 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)

错误:    enter image description here

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"