Pandas dataframe заменяет em-dash на nan - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь прочитать в python большое количество файлов .xls и .xlsx с преимущественно числовыми данными, используя pd.read_excel.Однако файлы используют em-dash для пропущенных значений.Я пытаюсь заставить Python заменить все эти em-тире как nans.Кажется, я не могу найти способ заставить Python даже распознавать персонажа, не говоря уже о его замене.Я попробовал следующее, которое не сработало

df['var'].apply(lambda x: re.sub(u'\2014','',x))

Я также попробовал просто

df['var'].astype('float')

Каков наилучший способ получить все em-тире в кадре данных для преобразования в nans, сохраняя числовые данные как плавающие?

Ответы [ 4 ]

0 голосов
/ 30 мая 2018

Не уверен, что именно происходило с этими штрихами (которые отображались как u '\ u2013', когда я выполнял df.get_value (0, 'var')), но я нашел работающее решение, которое преобразовалоштрихи к nans и сохраненные числовые данные в виде чисел.

import unicodedata

df['var']=df['var'].map(unicode)
df['var']=df['var'].apply(lambda x: unicodedata.normalize('NFKD', x).encode('ascii','ignore'))
df['var']=pd.to_numeric(df['var'])
0 голосов
/ 29 мая 2018

Вы должны поймать ошибку на более ранней стадии.Скажите pd.read_excel(), что вы должны рассматривать em-тире как NaNs:

df = pd.read_excel(..., na_values=['–','—'])
0 голосов
/ 29 мая 2018

df.replace({'-': None}) - это то, что вы ищете.Найдено в другом посте о переполнении стека.

0 голосов
/ 29 мая 2018

Я думаю, что самым простым способом сделать это было бы pd.to_numeric с аргументом errors='coerce':

df['var'] = pd.to_numeric(df['var'], errors='coerce')

Из документов :

Если 'coerce', то недействительный синтаксический анализ будет установлен как NaN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...