Заполните столбец dataframe значением, если несколько столбцов соответствуют значениям в словаре - PullRequest
0 голосов
/ 23 февраля 2020

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

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

Отсутствует значение df:

    Color      Number    Letter       Value
0   Red          2          B          NaN
1   Green        2          A          NaN 
2   Red          2          B          NaN
3   Red          1          B          NaN
4   Green        1          A          NaN
5   Red          2          B          NaN
6   Green        1          B          NaN
7   Green        2          A          NaN

Словарь df:

    Color      Number    Letter       Value
0   Red          1          A          10
1   Red          1          B           4
2   Red          2          A           3
3   Red          2          B          15
4   Green        1          A          21
5   Green        1          B           9
6   Green        2          A          22
7   Green        2          B           1

Требуется df:

0   Red          2          B          15
1   Green        2          A          22 
2   Red          2          B          15
3   Red          1          B          4
4   Green        1          A          21
5   Red          2          B          15
6   Green        1          B          9
7   Green        2          A          22

Я не уверен, если я должен иметь словарь df в качестве фактического словаря или хранить его в качестве фрейма данных (он извлекается из CSV-файла).

Можно ли сделать это чисто без множества операторов if else?

Спасибо!

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

Попробуйте:

missing_df.reset_index()[['index', 'Color', 'Number', 'Letter']]\
          .merge(dict_df, on = ['Color', 'Number', 'Letter'])\
          .set_index('index').reindex(missing_df.index)

Вывод:

  Color  Number Letter  Value
0    Red       2      B     15
1  Green       2      A     22
2    Red       2      B     15
3    Red       1      B      4
4  Green       1      A     21
5    Red       2      B     15
6  Green       1      B      9
7  Green       2      A     22
1 голос
/ 24 февраля 2020

Работает ли это?

>>> df_1[['Color', 'Number', 'Letter']].merge(df_2, 
...                                           on=('Color', 'Number', 'Letter'),   
...                                           how='left')
   Color  Number Letter  Value
0    Red       2      B     15
1  Green       2      A     22
2    Red       2      B     15
3    Red       1      B      4
4  Green       1      A     21
5    Red       2      B     15
6  Green       1      B      9
7  Green       2      A     22

Думаю, стоит упомянуть - очень простой способ конвертировать примеры из stackoverflow pandas вопросов в фрейм данных, просто вырезать и вставить его в строку, подобную этой:

>>> df_1 = pd.read_csv(StringIO("""
...     Color      Number    Letter       Value
... 0   Red          2          B          NaN
... 1   Green        2          A          NaN
... 2   Red          2          B          NaN
... 3   Red          1          B          NaN
... 4   Green        1          A          NaN
... 5   Red          2          B          NaN
... 6   Green        1          B          NaN
... 7   Green        2          A          NaN
... """), sep=r'\s+')
0 голосов
/ 24 февраля 2020

Я буду называть пропущенное значение df как: df, а словарь df как: ddf, рассматривая оба как фреймы данных

Сначала удалите столбец нулевых значений из пропущенного значения df:

df.drop(['Value'], axis=1)

Во-вторых, запустите приведенную ниже команду, которая должна выполнить задачу за вас.

df.assign(Value=ddf['Value'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...