Почему появляется ошибка, когда я применяю функцию к фрейму данных?

#python #pandas #function #dataframe #typeerror

#python #pandas #функция #фрейм данных #ошибка типа

Вопрос:

 def function(s):
    if (s['col1'] == 'something1')|(s['col1'] == 'smth2')|(s['col1'] == 'smth3'):
        return 'A'
    elif (s['col1'] == 'smth4')|(s['col1'] == 'smth5'):
        return 'B'
    elif (s['col1'] == 'smth6')|(s['col1'] == 'smth7'):
        return 'C'
    else:
        return 'D'
  

Описанная выше функция сработала. Но когда я применяю ее к фрейму данных:

 df['new_col'] = df.apply(function, axis = 1)
  

Я получаю:

 TypeError: ("'bool' object is not callable", 'occurred at index 0') 
  

Комментарии:

1. Вы уверены, что нет другой вызываемой переменной function , которая перезаписала фактическое определение функции?

2. Для меня работает правильно.

3. Нет, нет переменной, называемой функцией.

Ответ №1:

Для меня работает правильно, вот альтернативное решение с Series.isin и numpy.select :

 df = pd.DataFrame({
    'col1':['something1','jeff bridges','smth7','billy boy','smth5']})


print (df)

def function(s):
    if (s['col1'] == 'something1')|(s['col1'] == 'smth2')|(s['col1'] == 'smth3'):
        return 'A'
    elif (s['col1'] == 'smth4')|(s['col1'] == 'smth5'):
        return 'B'
    elif (s['col1'] == 'smth6')|(s['col1'] == 'smth7'):
        return 'C'
    else:
        return 'D'
    
df['new_col'] = df.apply(function, axis = 1)
  

 m1 = df['col1'].isin(['something1','smth2','smth3'])
m2 = df['col1'].isin(['smth4','smth5'])
m3 = df['col1'].isin(['smth6','smth7'])

df['new_col1'] = np.select([m1, m2, m3], ['A','B','C'], default='D')
print (df)
           col1 new_col new_col1
0    something1       A        A
1  jeff bridges       D        D
2         smth7       C        C
3     billy boy       D        D
4         smth5       B        B
  

Комментарии:

1. Большое спасибо, второй сработал, но я не понял, почему другой не работает?

2. @SaidTaxmezov — Сложный вопрос, для меня все работает правильно. Если изменение имени функции не помогает?