Как заполнить столбец данных pandas тестами значения другого столбца? - PullRequest
0 голосов
/ 10 мая 2019

Прежде чем задать свой вопрос, я должен сказать, что думаю, что есть простое решение, которое я упускаю полностью. Я искал в Google ответ и приблизился, но не совсем к тому, что мне нужно.

Я пытаюсь найти способ проверить значения в одном столбце кадра данных и заполнить другой новый столбец одним из 4 значений на основе этого первого столбца.

Я пытался сделать несколько вещей, чтобы понять, что я делаю. Поскольку в моем столбце "output_notes" нет стандартизированных результатов, я надеюсь стандартизировать результаты по 4 категориям:

Полная в ожидании незавершенный Отменено

Я могу попытаться сделать:

df1['outcome'].map({'complete': 'Complete', 'incomplete': 'Incomplete', 'Pending': 'Pending'})

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

Я также пытался использовать это, но не уверен, как именно получить его для заполнения столбца:

df1[df1['outcome_notes'].str.contains(r'\bcomplete', na=False)]

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

Я боролся с утверждением if then, но я боюсь, что мои навыки работы с Python делают это так, что я не знаю, как правильно спроектировать логику для этого.

import pandas as pd
d  = {'id': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'], 'outcome_notes': ['complete', 'pending', 'incomplete', 'canceled', 'completed', 'complete', '', 'completed -- doctor says', 'canceled due to doctor', '']}

df1 = pd.DataFrame(data=d)

Мне бы очень хотелось, чтобы фрейм данных выглядел так:

d  = {'id': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'], 'outcome_notes': ['complete', 'pending', 'incomplete', 'canceled', 'completed', 'complete', '', 'completed -- doctor says', 'canceled due to doctor', ''], 'outcome': 'Complete', 'Pending', 'Incomplete', 'Canceled', 'Complete', 'Complete', '', 'Complete', 'Canceled', '']}

df1 = pd.DataFrame(data=d)

1 Ответ

1 голос
/ 10 мая 2019

Обратите внимание, это основано на том, что у вас нет орфографических ошибок в вашем outcome_notes.str.findall

s=df1.outcome_notes
df1['New']=s.str.findall('|'.join(s.iloc[:4])).str[0]
df1
Out[449]: 
   id             outcome_notes         New
0   1                  complete    complete
1   2                   pending     pending
2   3                incomplete  incomplete
3   4                  canceled    canceled
4   5                 completed    complete
5   6                  complete    complete
6   7                                   NaN
7   8  completed -- doctor says    complete
8   9    canceled due to doctor    canceled
9  10                                   NaN

Нечеткое совпадение

from fuzzywuzzy import process
a=s.iloc[:4]
matchdf=pd.DataFrame(s.map(lambda x : process.extract(x, a, limit=1)).str[0].tolist(),index=df1.index)
df1['New2']=matchdf.loc[matchdf[1]>60,0]
df1
Out[482]: 
   id             outcome_notes         New        New2
0   1                  complete    complete    complete
1   2                   pending     pending     pending
2   3                incomplete  incomplete  incomplete
3   4                  canceled    canceled    canceled
4   5                 completed    complete    complete
5   6                  complete    complete    complete
6   7                                   NaN         NaN
7   8  completed -- doctor says    complete    complete
8   9    canceled due to doctor    canceled    canceled
9  10                                   NaN         NaN
...