#python #pandas
#python #pandas
Вопрос:
В моем наборе данных есть столбец с именем age
, и я пытаюсь подсчитать значения null.
Я знаю, что этого можно легко достичь, выполнив что-то вроде len(df) - df['age'].count()
. Тем не менее, я играю с функциями и просто хочу применить функцию для вычисления нулевого значения.
Вот что у меня есть:
def age_is_null(df):
age_col = df['age']
null = df[age_col].isnull()
age_null = df[null]
return len(age_null)
count = df.apply(age_is_null)
print (count)
Когда я это делаю, я получил сообщение об ошибке: KeyError: 'age'
.
Может кто-нибудь сказать мне, почему я получаю эту ошибку и что я должен изменить в коде, чтобы она работала?
Комментарии:
1. Я думаю, вы неправильно понимаете, как
apply
это работает. Проверьте в документах, какие функции вы можете использовать с ним.
Ответ №1:
Вам нужно DataFrame.pipe
или передать фрейм данных, чтобы функционировать здесь:
#function should be simplify
def age_is_null(df):
return df['age'].isnull().sum()
count = df.pipe(age_is_null)
print (count)
count = age_is_null(df)
print (count)
Ошибка означает, что если использовать DataFrame.apply
, то выполнить итерацию по столбцам, поэтому не удалось, если требуется выбрать столбец age
.
def func(x):
print (x)
df.apply(func)
РЕДАКТИРОВАТЬ: для выбора столбца используйте имя столбца:
def age_is_null(df):
age_col = 'age' <- here
null = df[age_col].isnull()
age_null = df[null]
return len(age_null)
Или передайте выбранный столбец для маски:
def age_is_null(df):
age_col = df['age']
null = age_col.isnull() <- here
age_null = df[null]
return len(age_null)
Комментарии:
1. Привет, спасибо за вашу помощь. Когда я использовал ваш код, он отлично работает. Тем не менее, я больше пытаюсь понять, почему это не сработало для моего исходного кода. Я оставил свою функцию такой, какая она есть, и изменил count = df.pipe(age_is_null), а затем print (count) . Это все еще выдает мне ошибку. Разница между выводом вашей функции и моей функции заключается в том, что у вас есть тип numpy.int32, а мой — int . Это основная причина, по которой у меня это не сработало?
2. Я попытался передать фрейм данных, что означает, что я пробовал count = age_is_null(df) до того, как я опубликовал этот вопрос, и это сообщение об ошибке, которое я получил, и это то же сообщение об ошибке, что и при изменении на pipe вместо apply . «»Ни один из [Float64Index([22.0, 38.0, 26.0, 35.0, 35.0, нэн, 54.0, 2.0, 27.0, 14.0, n…n 33.0, 22.0, 28.0, 25.0, 39.0, 27.0, 19.0, nan, 26.0, 32.0],n dtype=’float64′, длина = 891)] находятся в [столбцах]»
3. @MkD — был двойной выбор, отредактированный ответ для возможных решений.
Ответ №2:
Вместо создания функции вы можете попробовать это
df[df["age"].isnull() == True].shape
Комментарии:
1. На самом деле вам не нужна часть `== True`, вы можете просто
df[df["age"].isnull()]
использовать.
Ответ №3:
Вам нужно передать dataframe df при вызове функции age_is_null .Вот почему столбец age не распознается.
count = df.apply(age_is_null(df))
Комментарии:
1. Я не проверял весь код, но когда я попытался использовать age_is_null(), он выдает ошибку- TypeError: age_is_null() отсутствует 1 требуемый позиционный аргумент: ‘df’