2014-09-04 2 views
0

Привет, у меня есть фрейм данных (df), который содержит два столбца (дата, текст), которые считываются из электронной таблицы Excel в Python/Pandas.Python Convert Pandas Float to String

xl = pd.ExcelFile(dir+"file.xlsx") 
df = xl.parse(xl.sheet_names[0]) 

    date  text     
0 2013-08-06 NaN     
1 2013-08-06 Text with unicode 
2 ... 

Текст содержит нежелательные символы Юникода, которые я обычно вырезать с помощью

df['text'] = df['text'].apply(lambda sentence: ''.join(word for word in sentence if ord(word) < 128)) 

Однако, поскольку текст в первой строке содержит «NaN», представляется, что столбец набираясь как " float "от Pandas и вышеприведенная команда не работает, поскольку она работает только с строками. Я не могу найти способ, чтобы переназначить тип как строку, так как содержит символы Юникода:

df['text'] = df['text'].astype(str) 

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-12: ordinal not in range(128) 

Он чувствует, как я получаю в «курица или яйцо» дилеммой.

+0

Вы можете включать вы используете для чтения таблицы? – chrisaycock

+1

Можете ли вы не просто называть 'dropna', либо хотите заменить« NaN »на какое-то значение? – EdChum

+0

@chrisaycock: Я добавил строку для чтения таблицы. – slaw

ответ

1

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

Итак, вам нужно иметь дело с NaNs - Как вы хотите, чтобы ваш код конвертировал NaN? до 'NaN'?

Этот вид превосходит точку NaN как особое значение. Если вы не хотите значений NaN - вы можете использовать dropna. Если вам нужно другое значение (или строковое значение), вы можете использовать .fillna('NaN'). Если вы хотите сохранить пренебрежимо малых для будущего использования (который, кажется, как способ пойти для меня) - просто частный случай для них в вашем лямбда, который будет держать их как NaNs:

from pandas import isnull 
lambda sentence: sentence if isnull(sentence) else \ 
          ''.join(word for word in sentence if ord(word) < 128) 
+0

Как указано в сообщении, текст в настоящее время набирается как «float» и ему нужно сначала преобразовать строку «string». Однако я не могу преобразовать текст в строку из-за нежелательного юникода в тексте. – slaw

+0

@slaw Как насчет того, чтобы опубликовать некоторые реальные данные в вопросе. – Korem