Обновить значения NaN с помощью словаря значений на основе условия - PullRequest
1 голос
/ 09 июля 2020

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

   c1  c2
0   a  12  
1   b  NaN
2   a  45
3   c  NaN
4   c  32
5   b  NaN

и у меня есть такой словарь

di = {
'a': 10, 'b': 20, 'c':30
}

Я хочу обновить свой фрейм данных вот так

   c1  c2
0   a  12  
1   b  20
2   a  45
3   c  30
4   c  32
5   b  20

есть ли способ сделать это без использования длинной лямбда-функции с условиями Вот код для создания вашего фрейма данных

a = pd.DataFrame({
    'c1': ['a', 'b', 'a', 'c', 'c', 'b'],
    'c2': [12, np.NaN, 45, np.NaN, 32, np.NaN]
})
di = {
    'a': 10, 'b': 20, 'c':30
}
di

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Вы можете использовать метод apply (), чтобы справиться с этим. Создайте функцию, а затем примените эту функцию к необходимым функциям.

`def deal_na(cols):
    x=cols[0]
    y=cols[1]
    if pd.isnull(y):
        return di[x]
    else:
        return y
 a['c2'] = a[['c1','c2']].apply(deal_na,axis=1)`

Здесь мы передаем значения функции «c1» и «c2» в виде списка функции в переменной cols. Затем мы присваиваем каждое значение 2 переменным x и y. Мы проверяем, является ли y нулевым или нет. Если он равен нулю, замените его на di [x], в противном случае верните его как есть.

0 голосов
/ 09 июля 2020

Используйте Series.map с Series.fillna для замены только отсутствующих значений:

a['c2'] = a['c2'].fillna(a['c1'].map(di))
print (a)
  c1    c2
0  a  12.0
1  b  20.0
2  a  45.0
3  c  30.0
4  c  32.0
5  b  20.0

Last, если все значения c1 находятся в ключах словаря, все значения пропущенных значений заменяются и возможно преобразование в целые числа:

a['c2'] = a['c2'].fillna(a['c1'].map(di)).astype(int)
print (a)
  c1  c2
0  a  12
1  b  20
2  a  45
3  c  30
4  c  32
5  b  20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...