2017-02-09 14 views
2

Общая операция, которую мне нужно сделать с помощью pandas, - это прочитать таблицу из файла excel и затем удалить точки с запятой из всех полей. Столбцы часто в смешанных типов данных, и я бегу в AtributeError, когда пытаешься сделать что-то вроде этого: for col in cols_to_check: df[col] = df[col].map(lambda x: x.replace(';',''))удаление символа из всего фрейма данных

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

когда я оберните его в str() перед заменой у меня есть проблемы с символами Unicode, например for col in cols_to_check: df[col] = df[col].map(lambda x: str(x).replace(';',''))

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 3: ordinal not in range(128)

В Excel это очень простая операция, все, что требуется, чтобы заменить ; с пустой строкой. Как я могу сделать это аналогично в пандах для всего кадра данных, игнорируя типы данных? Или я чего-то не хватает?

ответ

1

Вы можете использовать DataFrame.replace и для выбора использования subset:

df = pd.DataFrame({'A':[1,2,3], 
        'B':[4,5,6], 
        'C':['f;','d:','sda;sd'], 
        'D':['s','d;','d;p'], 
        'E':[5,3,6], 
        'F':[7,4,3]}) 

print (df) 
    A B  C D E F 
0 1 4  f; s 5 7 
1 2 5  d: d; 3 4 
2 3 6 sda;sd d;p 6 3 

cols_to_check = ['C','D', 'E'] 

print (df[cols_to_check]) 
     C D E 
0  f; s 5 
1  d: d; 3 
2 sda;sd d;p 6 

df[cols_to_check] = df[cols_to_check].replace({';':''}, regex=True) 
print (df) 
    A B  C D E F 
0 1 4  f s 5 7 
1 2 5  d: d 3 4 
2 3 6 sdasd dp 6 3 
+0

спасибо, это работает! То, что мне не хватало, было 'regex = True'. Без него 'replace' ищет всю строку, а не частичную (так же, как опция соответствия целого элемента содержимого excel) – user3087386

+0

Да, вы правы. Спасибо, что приняли! – jezrael

+0

Я бы предложил небольшое обновление вашего ответа. В моем вопросе я упоминаю, что у меня смешанные типы данных в столбцах (не только между столбцами). Но в вашем примере вы используете согласованные типы данных. Также вы проверяете столбцы со строками, но 'df = df.replace ({';': ''}, regex = True)' работает так же хорошо, и даже если вы измените один из столбцов на что-то например '['a;', 1.02, 'b']' – user3087386