Python - функция для перебора каждой строки в панде - PullRequest
0 голосов
/ 25 января 2019

У меня есть фрейм данных с одним столбцом, и я пытаюсь перебрать каждую строку этого столбца с помощью функции и получить значения в новый столбец. Итак, сначала я попытался запустить выражение регулярного выражения в одной строке, чтобы убедиться, что я получаю ожидаемые результаты:

# 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 голосов
/ 25 января 2019

Ошибка возникла из-за того, что 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...