Обновить значения столбца на основе других столбцов - PullRequest
0 голосов
/ 18 мая 2018

Я плохо разбираюсь в Pandas и не очень хорошо понимаю Python.

Я хочу обновить столбец (d.Alias) на основе значения существующих столбцов (d.Company и * 1005).*).d.Alias должно быть равно d2.Alias, если d2.Alias является подстрокой d.Company.

Примеры наборов данных:

d = {'Company': ['The Cool Company Inc', 'Cool Company, Inc', 'The Cool 
        Company', 'The Shoe Company', 'Muffler Store', 'Muffler Store'],
    'Position': ['Cool Job A', 'Cool Job B', 'Cool Job C', 'Salesman', 
        'Sales', 'Technician'],
    'City': ['Tacoma', 'Tacoma','Tacoma', 'Boulder', 'Chicago', 'Chicago'],
    'State': ['AZ', 'AZ', 'AZ', 'CO', 'IL', 'IL'],
    'Alias': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]}
d2 = {'Company': ['The Cool Company, Inc.', 'The Shoe Company', 'Muffler 
         Store LLC'],
    'Alias': ['Cool Company', np.nan, 'Muffler'],
    'First Name': ['Carol', 'James', 'Frankie'],
    'Last Name': ['Fisher', 'Smith', 'Johnson']}

np.nan для The Shoe Company потому чтов этом случае псевдоним не требуется.

Я пытался использовать .loc, for петли, while петли, pandas.where, numpy.where и несколько вариантов каждого без желаемых результатов.При использовании цикла for конец d2.Alias копировался во все строки в d.Alias.Однако я не смог воспроизвести это.

Предыдущие посты, которые я просмотрел, я не смог заставить их работать или не понял их: Условно заполнить столбец значением из другого DataFrame, основываясь на совпадении строк в Pandas pandas создает новый столбец на основе значений из других столбцов

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ:

Ожидаемый результат

Обновление:
После нескольких дней работы я достиг желаемого результата.С ответом Вэнь мне пришлось изменить несколько вещей.

Сначала я создал список из df2.Alias с именем aliases:
aliases = df2.Alias.unique()

Затем мне пришлосьудалить .map(df2.set_index('Company').Alias.Строка, которая произвела мои желаемые результаты:
df1['Alias'] = df1.Company.apply(lambda x: [process.extract(x, aliases, limit=1)][0][0][0]).

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Раствор от fuzzywuzzy

from fuzzywuzzy import process

df1['Alias']=df1.Company.apply(lambda x :[process.extract(x, df2.Company, limit=1)][0][0][0]).map(df2.set_index('Company').Alias)
df1
Out[31]: 
          Alias     City               Company    Position State
0  Cool Company   Tacoma  The Cool Company Inc  Cool Job A    AZ
1  Cool Company   Tacoma     Cool Company, Inc  Cool Job B    AZ
2  Cool Company   Tacoma      The Cool Company  Cool Job C    AZ
3           NaN  Boulder      The Shoe Company    Salesman    CO
4       Muffler  Chicago         Muffler Store       Sales    IL
5       Muffler  Chicago         Muffler Store  Technician    IL
0 голосов
/ 18 мая 2018

Один из подходов состоит в том, чтобы перебрать ваш предположительно намного меньший информационный фрейм и просто посмотреть, когда псевдоним является подстрокой d.Company, а затем просто заменить псевдоним этим.

import pandas as pd
d = pd.DataFrame(d)
d2 = pd.DataFrame(d2)

for row in d2[d2.Alias.notnull()].itertuples():
    d.loc[d.Company.str.contains(row.Alias), 'Alias'] = row.Alias

print(d)
#          Alias     City               Company    Position State
#0  Cool Company   Tacoma  The Cool Company Inc  Cool Job A    AZ
#1  Cool Company   Tacoma     Cool Company, Inc  Cool Job B    AZ
#2  Cool Company   Tacoma      The Cool Company  Cool Job C    AZ
#3           NaN  Boulder      The Shoe Company    Salesman    CO
#4       Muffler  Chicago         Muffler Store       Sales    IL
#5       Muffler  Chicago         Muffler Store  Technician    IL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...