Панды применяют функцию, получая KeyError ‘Имя столбца’

#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’