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

У меня есть большой pandas массив данных с числовыми значениями, структурированными так:

>>> df1
   A  B  C
0  2  1  2
1  1  2  3
2  2  3  1

Мне нужно заменить все вышеприведенные значения ячеек на «описание», которое отображается на имя поля и значение ячейки, на которое ссылаются в другом фрейме данных, структурированном так:

>>> df2
  field_name  code description
0          A     1          NO
1          A     2         YES
2          A     3       MAYBE
3          B     1           x
4          B     2           y
5          B     3           z
6          C     1        GOOD
7          C     2         BAD
8          C     3        FINE

Желаемый результат будет выглядеть так:

>>> df3
     A  B     C
0  YES  x   BAD
1   NO  y  FINE
2  YES  z  GOOD

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

Спасибо.

Ответы [ 2 ]

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

Используйте DataFrame.replace с DataFrame.pivot:

df1 = df1.replace(df2.pivot(columns='field_name', index='code', values='description')
                     .to_dict())

Возможно, вам понадобится выбрать столбцы ранее:

df1[cols] = df1[cols].replace(df2.pivot(columns='field_name',
                                        index='code', values='description')
                                 .to_dict())

Выход

print(df1)
     A  B     C
0  YES  x   BAD
1   NO  y  FINE
2  YES  z  GOOD
0 голосов
/ 15 апреля 2020

Вы можете распаковать df1, объединить с df2 и pivot, результат:

df3 = df1.stack().reset_index().rename(
    columns={'level_1': 'field_name', 0: 'code'}).merge(
        df2, 'left', on=['field_name', 'code']).pivot(
            index='level_0', columns='field_name',
            values='description').rename_axis(None).rename_axis(None, axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...