Извлечение слов из столбца, которых нет в списке, и создание нового столбца - PullRequest
0 голосов
/ 06 апреля 2020

Я хотел бы извлечь указанную подстроку c из строкового значения в столбце. В приведенном ниже коде вы увидите, что мне удалось извлечь год, марку и модель.

import pandas as pd
import numpy as np

data = [['year_make_model'], 
    ['1970 Plymouth Hemi Cuda'], 
    ['1970 Dodge Challenger R/T SE Convertible'], 
    ['1971 Plymouth Cuda']]

data = pd.DataFrame(data[1:], columns=data[0])

def create_year_make_model(df):
    df['year'] = df.year_make_model.str.extract('(\d\d\d\d)', expand=True) 
    df['make'] = np.where(df.year_make_model.str.contains('Plymouth'), 'Plymouth',
                             np.where(df.year_make_model.str.contains('Dodge'), 'Dodge', 'Nan'))
    df['model'] = np.where(df.year_make_model.str.contains('Cuda'), 'Cuda',
                             np.where(df.year_make_model.str.contains('Challenger'), 'Challenger', 'Nan'))
    return df.head()                   

create_year_make_model(data)

                             year_make_model    year        make         model
0   1970 Plymouth Hemi Cuda                     1970    Plymouth          Cuda
1   1970 Dodge Challenger R/T SE Convertible    1970    Dodge       Challenger
2   1971 Plymouth Cuda                          1971    Plymouth          Cuda

Теперь мне нужно извлечь все оставшиеся слова (если они есть). Остальные слова составляют «тип» автомобиля (см. Пример ниже).

car_type = ['Hemi', 'R/T SE Convertible', None]
data['type'] = car_type
data 

                             year_make_model    year        make         model                   type
0   1970 Plymouth Hemi Cuda                     1970    Plymouth          Cuda                   Hemi
1   1970 Dodge Challenger R/T SE Convertible    1970    Dodge       Challenger     R/T SE Convertible
2   1971 Plymouth Cuda                          1971    Plymouth          Cuda                   None

До сих пор я безуспешно пробовал много разных подходов. Один из подходов, который я попробовал, - это создание списка на весь год, марки и комбинации моделей word_list = ['Cuda','Challenger','1970','1971','Dodge','Plymouth']. Затем я сделал для l oop, пытаясь извлечь слова из столбца year_make_model, которых нет в word_list, но я не смог заставить его работать. Я надеюсь, что кто-то знает хитрость для решения моей проблемы, спасибо заранее!

1 Ответ

1 голос
/ 06 апреля 2020

Я не уверен, что это лучший способ решить эту проблему, но, похоже, он работает:

import numpy as np
import pandas as pd

data = [['year_make_model'], 
    ['1970 Plymouth Hemi Cuda'], 
    ['1970 Dodge Challenger R/T SE Convertible'], 
    ['1971 Plymouth Cuda']]

data = pd.DataFrame(data[1:], columns=data[0])

def create_year_make_model(df):
    cell_text = df.year_make_model.str

    df['year'] = cell_text.extract('(\d\d\d\d)', expand=True)

    df['make'] = np.where(cell_text.contains('Plymouth'), 'Plymouth',
                           np.where(cell_text.contains('Dodge'), 'Dodge', 'Nan'))

    df['model'] = np.where(cell_text.contains('Cuda'), 'Cuda',
                             np.where(cell_text.contains('Challenger'), 'Challenger', 'Nan'))

    # what fields to remove
    rm_fields = ["year", "make", "model"]

    for field in rm_fields:
      # remove this field
      for val in getattr(df, field).values:
        cell_text = cell_text.replace(str(val), "").str

    # clean any leading/trailing spaces
    cell_text = cell_text.replace(r"^\s+", "")
    cell_text = cell_text.replace(r"\s+$", "")

    df['type'] = cell_text

    return df.head()    

print(create_year_make_model(data))

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

Также любые возможные начальные / конечные пробелы должны быть удалены для согласованности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...