2016-08-31 2 views
0

У меня есть фрейм данных "b" с номерами, хранящимися как текст типа '12 .5% '. Одна колонка:python применить функцию к df pandas - ошибка атрибута

1  NaN 
2  NaN 
3  1.2% 
4  0.6% 
5  NaN 
6  1.4% 
7  0.1% 
8  NaN 
9  5.1% 
10  2.5% 
11 89.1% 
12  NaN 
Name: Idaho, dtype: object 

Я написал функцию, чтобы применить к каждой колонке:

def sinPorc(tbl): 
    return float(tbl.replace('%', '')) 

, но когда я пытаюсь применить его я получаю:

b.Idaho.apply(sinPorc) 

AttributeError: 'float' object has no attribute 'replace'

Я также создал примерную таблицу и применил функцию, но в этом случае работал:

ejemplo=pd.DataFrame({'A':['1.3%', 'NaN'], 
       'B':['1.3%', '0.7%']}) 

ejemplo.A.apply(sinPorc) 

и я получил ожидаемый результат:

1.3 
    NaN 
Name: A, dtype: float64 

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

Спасибо.

+1

Try: 'поплавок (ул (TBL) .Надеть ('%', ''))' в 'def' function.You необходимо привести свои элементы строки как' string' для 'replace' работать. –

+0

Спасибо @NickilMaveli, все в порядке. Я не понимаю, почему исходная функция работала во второй таблице, не требуя этого. – GabyLP

+0

Похоже, что в столбце уже есть значения с плавающей запятой. Я попытался реплицировать значения как строковый тип, а затем как типы float. Может быть полезно отлаживать, набрав 'type (b.Idaho [0])', предполагая, что индекс 0 имеет значение, которое не является 'NaN' –

ответ

2

Ваш оригинальный метод не работает, потому что NaN не была строка, но значение с плавающей точкой np.NaN

Попробуйте это ...

np.NaN.replace('%', '') 

и вы получите ту же ошибку.

AttributeError: 'float' object has no attribute 'replace' 

Вы можете изменить sinPorc к

def sinPorc(tbl): 
    if tbl is np.NaN: 
     return tbl 
    else: 
     return float(tbl.replace('%', '')) 

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

float(str(tbl).replace('%', '')) 
Смежные вопросы