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

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

Сначала на ум приходят два очевидных решения:

1) dataframe.replace ()

2) Слияние фрейма данных с другим с использованием неверных значений в качестве ключа

Эти параметры не кажутся практическими решениями моей проблемы по нескольким причинам.

Для решения 1 (dataframe.replace ()) у меня просто слишком много значений, которые нужно заменить, чтобы продолжать добавлять строку за строкой команд df.replace каждый раз, когда я принимаю новые данные.

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

Ниже приведен простой пример того, с какими двумя (в идеале) данными я бы работал (* в идеале):

df1:

ResponseID      InputA       InputB
-------------------------------------
|ABC123     |   Chikcen   |  First  |
|DEF456     |   Cwo       |  Second |
|GHI789     |   Dog       |  Third  | 
-------------------------------------

df2:

Old_Value      New_Value
---------------------------
|Chikcen    |   CHICKEN   |
|Cwo        |   COW       |
|Dog        |   DOG       |
|First      |    1        |
|Second     |    2        |
|Third      |    3        |
---------------------------

Я хотел бы запустить эти столбцы в df1 (InputA и InputB) для столбца Old_Value в df2 и заменить эти значения соответствующими значениями в столбце New_Value.

В идеале это приведет к созданию следующего кадра данных

df_final:

ResponseID      InputA       InputB
-------------------------------------
|ABC123     |   CHICKEN   |  1      |
|DEF456     |   COW       |  2      |
|GHI789     |   DOG       |  3      | 
-------------------------------------

Если это действительно возможно, я не могу представить, что решение будет очень сложным. Моя проблема в том, что я не знаю, как этот тип процесса даже был бы назван, чтобы искать где-то ранее существовавший ответ. Спасибо

Ответы [ 3 ]

0 голосов
/ 30 сентября 2019

Используйте map здесь, чтобы отобразить старое значение на новое значение. Единственная хитрость здесь в том, что вам нужно несколько столбцов. Поэтому мы должны использовать apply здесь:

final = df1.set_index('ResponseID')\
           .apply(lambda x: x.map(df2.set_index('Old_Value')['New_Value']))\
           .reset_index()

Выход

  ResponseID   InputA InputB
0     ABC123  CHICKEN      1
1     DEF456      COW      2
2     GHI789      DOG      3
0 голосов
/ 30 сентября 2019

использовать pandas.Series.map :

final_df=df1.copy()
final_df['InputA']=final_df['InputA'].map(df2.set_index('Old_Value')['New_Value'])
final_df['InputB']=final_df['InputB'].map(df2.set_index('Old_Value')['New_Value'])
print(final_df)

  ResponseID   InputA InputB
0     ABC123  CHICKEN      1
1     DEF456      COW      2
2     GHI789      DOG      3
0 голосов
/ 30 сентября 2019

Это один случай, когда apply пригодится:

df2.set_index('Old_Value', inplace=True)

df1.iloc[:,1:]  = df1.iloc[:, 1:].apply(lambda x: x.map(df2['New_Value']))

Вывод:

  ResponseID   InputA InputB
0     ABC123  CHICKEN      1
1     DEF456      COW      2
2     GHI789      DOG      3

Обратите внимание, что apply по сути является циклом for для столбцов, поэтому выне теряйте много производительности, используя его здесь.

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