Python 将 Pandas 浮点数转换为字符串
你好,我有一个数据框(df),里面有两列(日期和文本),这些数据是从Excel表格读到Python/Pandas里的。
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 ...
文本中包含一些不需要的unicode字符,我通常会用下面的方式把它们去掉:
df['text'] = df['text'].apply(lambda sentence: ''.join(word for word in sentence if ord(word) < 128))
不过,因为第一行的文本里有“NaN”,所以Pandas把这一列的类型设成了“浮点数”,这样上面的命令就失效了,因为它只对字符串有效。我找不到办法把类型重新设为字符串,因为里面有unicode字符:
df['text'] = df['text'].astype(str)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-12: ordinal not in range(128)
我感觉我陷入了一个“先有鸡还是先有蛋”的困境。
1 个回答
1
你的整列数据并不是全部都被当作浮点数处理的,否则它根本无法存储字符串。实际上,导致你方法出错的只是那些NaN值。
所以你需要处理这些NaN值——你希望你的代码如何处理NaN呢?是把它们转换成'NaN'
吗?
这样做其实有点违背了NaN作为特殊值的意义。如果你不想要NaN值,可以使用dropna
来去掉它们。如果你想用其他值代替(或者用字符串值)的话,可以用.fillna('NaN')
。如果你想保留这些NaN值以备将来使用(我觉得这样比较好),那么在你的lambda函数中专门处理一下这些NaN值,这样它们就会保持为NaN:
from pandas import isnull
lambda sentence: sentence if isnull(sentence) else \
''.join(word for word in sentence if ord(word) < 128)