Отображение панд на несколько элементов словаря для классификации данных - PullRequest
0 голосов
/ 28 ноября 2018

У меня большой фрейм данных, содержащий столбец 'Description'.

Я собрал большой словарь списков, ключом которого является категория, а элементы - списки возможных (под) строк, содержащихся в столбце описания.Я хочу использовать словарь для классификации каждой записи в кадре данных на основе этого описания ... К сожалению, я не могу понять, как применить словарь списков для сопоставления с кадрами данных (кажется, что это будет своего рода смесьmap, isin и str.contains но у меня не было радости).Я включил код для генерации набора данных модели ниже:

df = pd.DataFrame(np.random.randn(10, 1), columns=list('A'))

df['Description'] = ['White Ford Escort', 'Irish Draft Horse', 'Springer \
spaniel (dog)', 'Green Vauxhall Corsa', 'White Van', 'Labrador dog',\
'Black horse' ,'Blue Van','Red Vauxhall Corsa','Bear']

Этот набор данных модели в идеале должен быть каким-то образом сопоставлен со следующим словарем:

dict = {'Car':['Ford Escort','Vauxhall Corsa','Van'],
        'Animal':['Dog','Horse']}

для создания нового столбца вфрейм данных, с таким результатом:

|   | A                    | Description            | Type   |
|---|----------------------|------------------------|--------|
| 0 | -1.4120290137842615  | White Ford Escort      | Car    |
| 1 | -0.3141036399049358  | Irish Draft Horse      | Animal |
| 2 | 0.49374344901643896  | Springer spaniel (dog) | Animal |
| 3 | 0.013654965767323723 | Green Vauxhall Corsa   | Car    |
| 4 | -0.18271952280002862 | White Van              | Car    |
| 5 | 0.9519081000007026   | Labrador dog           | Animal |
| 6 | 0.403258571154998    | Black horse            | Animal |
| 7 | -0.8647792960494813  | Blue Van               | Car    |
| 8 | -0.12429427259820519 | Red Vauxhall Corsa     | Car    |
| 9 | 0.7695980616520571   | Bear                   | -      |

Числа здесь явно не имеют значения, но в фреймах данных есть другие столбцы, и я хотел, чтобы это было отражено.Я счастлив использовать регулярное выражение или, возможно, изменить свой словарь на фрейм данных и выполнить объединение (я рассмотрел несколько маршрутов).

Это похоже на недавний вопрос ,но это не то же самое, и, конечно, ответ не помог мне.

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вы можете использовать библиотеку fuzzywuzzy для решения этой проблемы.Обязательно установите его через pip install fuzzywuzzy

from fuzzywuzzy import process

df = pd.DataFrame(np.random.randn(10, 1), columns=list('A'))

df['Description'] = ['White Ford Escort', 'Irish Draft Horse', 'Springer \
spaniel (dog)', 'Green Vauxhall Corsa', 'White Van', 'Labrador dog',\
'Black horse' ,'Blue Van','Red Vauxhall Corsa','Bear']

d = {'Car':['Ford Escort','Vauxhall Corsa','Van'],
    'Animal':['Dog','Horse']}

# Construct a dataframe from the dictionary
df1 = pd.DataFrame([*d.values()], index=d.keys()).T.melt().dropna()

# Get relevant matches using the library.
m = df.Description.apply(lambda x: process.extract(x, df1.value)[0])

# concat the matches with original df
df2 = pd.concat([df, m[m.apply(lambda x: x[1]>80)].apply(lambda x: x[0])], axis=1)

df2.columns = [*df.columns, 'matches']

# After merge it with df1
df2 = df2.merge(df1, left_on='matches', right_on='value', how='left')

# Drop columns that are not required and rename.
df2 = df2.drop(['matches','value'],1).rename(columns={'variable':'Type'})

print (df2)

          A             Description    Type
0 -0.423555       White Ford Escort     Car
1  0.294092       Irish Draft Horse  Animal
2  1.949626  Springer spaniel (dog)  Animal
3 -1.315937    Green Vauxhall Corsa     Car
4 -0.250184               White Van     Car
5  0.186645            Labrador dog  Animal
6 -0.052433             Black horse  Animal
7 -0.003261                Blue Van     Car
8  0.418292      Red Vauxhall Corsa     Car
9  0.241607                    Bear     NaN
0 голосов
/ 28 ноября 2018
  1. Рассмотрим сначала инвертирование вашего словаря , делая все строчными

  2. Затем в строке делим Описание на слова и делаем их строчными

    • например, 'Springer Spaniel (собака)' -> ['Springer', 'Spaniel', '(', 'Dog', ')']
  3. Для каждого строчного слова из (2) найдите его в перевернутом словаре из (1);используя применить

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