Как форматировать операторы If с несколькими условными операторами внутри функции

Я работаю над созданием функции, которая будет оценивать два условия из фрейма данных и передавать ряд заранее подготовленных возвращаемых значений с учетом входных данных обратно в фрейм данных, если он встретит NaN. Первое условие, которое я хотел бы иметь, - это проверить, является ли значение одного столбца NaN (очевидно), а затем проверить другой столбец, чтобы увидеть, какой ключ был присвоен идентификатору (1,2,3 и т. д.) . Конечная цель состоит в том, чтобы использовать метод .apply для функции, чтобы заполнить значения NaN значениями из функции обратно в исходный фрейм данных или оставить существующие значения (если они есть) в покое. Что заставляет меня повесить трубку, так это то, что я впервые написал что-то подобное для вызова в фрейме данных, и у меня возникла проблема с назначением в потоке управления.

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

Очевидно, что что-то не так в функции, но в идеале результат обновил бы значение NaN значением 40.

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

import pandas as pd
import numpy as np

frame = {'key' : [1,2,3,4,5],
    'height' : [70, 68, 74, 67, 72],
    'age' : [29,45,'N/A',51,34]}

frame = pd.DataFrame(frame)

frame.replace('N/A',np.nan)

def age (x):
    if (x['age'].isnull()) & (x['key'] == 3):
        return x.replace(np.nan, 40)
    else: 
        return x

result = frame.apply(age) 

Вот снимок кадра данных, который я хотел бы изменить

по какой причине вы избегаете .loc[]? попробуй: df.loc[(df.age.notnull()) & (df.key == 3), 'age'] = 40

steven 30.06.2019 01:13

У меня есть 3 других условия, и я просто решил, что это будет наиболее эффективным способом, учитывая размер df. Извините, я думал, что поместил это в ОП, но просто перечитал и не совсем понял.

D.Larkin 30.06.2019 02:21
0
3
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

import pandas as pd
import numpy as np
import math

frame = {'key' : [1,2,3,4,5],
    'height' : [70, 68, 74, 67, 72],
    'age' : [29,45,'N/A',51,34]}

frame = pd.DataFrame(frame)

frame = frame.replace('N/A',np.nan)

#function modified to compare the numpy float value with nan, math library is used here
def age(row):
    if (math.isnan(row['age'])) & (row['key'] == 3):
        return row.replace(np.nan, 40)
    else: 
        return row

result = frame.apply(age, axis=1) #here axis=1 is passing single row at a time to the function

входной фрейм данных:

key height age
1   70     29.0
2   68     45.0
3   74     NaN
4   67     51.0
5   72     34.0

фрейм данных результата:

key     height  age
1.0     70.0    29.0
2.0     68.0    45.0
3.0     74.0    40.0
4.0     67.0    51.0
5.0     72.0    34.0

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

Спасибо, чувак, сработало как шарм, даже когда я добавил другие параметры оператора IF. Придется прочитать «математическую» библиотеку, которую вы передали окружающей среде.

D.Larkin 30.06.2019 19:38

Другие вопросы по теме