Сопоставить значения словаря с ключевыми значениями в столбце данных - PullRequest
1 голос
/ 16 января 2020

У меня есть фрейм данных:

values
 NaN
 NaN
 [1,2,5]
 [2]
 [5]

И словарь

{nan: nan,
'1': '10',
 '2': '11',
 '5': '12',}

Фрейм данных содержит ключи из словаря.

Как заменить эти ключи на соответствующие значения из того же словаря?

Вывод:

values
 NaN
 NaN
 [10,11,12]
 [11]
 [12]

Я пробовал

so_df['values'].replace(my_dictionary, inplace=True)
so_df.head()

Ответы [ 3 ]

3 голосов
/ 16 января 2020

Вы можете использовать apply() метод pandas df. Проверьте реализацию ниже:

import pandas as pd
import numpy as np

df = pd.DataFrame([np.nan,
 np.nan,
 ['1', '2', '5'],
 ['2'],
 ['5']], columns=['values'])

my_dict = {np.nan: np.nan,
 '1': '10',
 '2': '11',
 '5': '12'}

def update(row):
    if isinstance(row['values'], list):
        row['values'] = [my_dict.get(val) for val in row['values']]
    else:
        row['values'] = my_dict.get(row['values'])
    return row

df = df.apply(lambda row: update(row), axis=1)

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

1 голос
/ 16 января 2020

Попробуйте:

df['values']=pd.to_numeric(df['values'].explode().astype(str).map(my_dict), errors='coerce').groupby(level=0).agg(list)
1 голос
/ 16 января 2020

Настройка

import numpy as np
df=pd.DataFrame({'values':[np.nan,np.nan,[1,2,5],[2],5]})
my_dict={np.nan: np.nan, '1': '10', '2': '11', '5': '12'}

Использование Series.explode с Series.map

df['values']=( df['values'].explode()
                       .astype(str)
                       .map(my_dict)
                       .dropna()
                       .astype(int)
                       .groupby(level = 0)
                       .agg(list) )

Если в вашем столбце значений есть другие строки, вам понадобится pd.to_numeric с errors = coerce, чтобы сохранить его, вы должны сделать:

df['values']=(pd.to_numeric( df['values'].explode()
                                         .astype(str)
                                         .replace(my_dict),
                             errors = 'coerce')
                .dropna()
                .groupby(level = 0)
                .agg(list) 
                .fillna(df['values'])
               )

Вывод

         values
0           NaN
1           NaN
2  [10, 11, 12]
3          [11]
4          [12]

ОБНОВЛЕНИЕ

решение без explode

df['values']=(pd.to_numeric( df['values'].apply(pd.Series)
                                         .stack()
                                         .reset_index(level=1,drop=1)
                                         .astype(str)
                                         .replace(my_dict),
                         errors = 'coerce')
                 .dropna()
                 .groupby(level = 0)
                 .agg(list) 
                 .fillna(df['values'])
         )
...