Я работаю над созданием функции, которая будет оценивать два условия из фрейма данных и передавать ряд заранее подготовленных возвращаемых значений с учетом входных данных обратно в фрейм данных, если он встретит 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)
У меня есть 3 других условия, и я просто решил, что это будет наиболее эффективным способом, учитывая размер df. Извините, я думал, что поместил это в ОП, но просто перечитал и не совсем понял.

Решение вашей проблемы можно решить, как указано ниже, если вы действительно хотите использовать пользовательскую функцию и применить ее.
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. Придется прочитать «математическую» библиотеку, которую вы передали окружающей среде.
по какой причине вы избегаете
.loc[]? попробуй:df.loc[(df.age.notnull()) & (df.key == 3), 'age'] = 40