您有一个数据框(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将该列键入为“float”,并且上述命令失败,因为它只对字符串进行操作。我找不到将类型重新分配为字符串的方法,因为它包含unicode字符:
df['text'] = df['text'].astype(str)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-12: ordinal not in range(128)
感觉我正陷入“鸡或鸡蛋”的困境。
答案 0 :(得分:1)
不是你的整个列都被称为浮点数 - 否则它根本就无法保存字符串。它只是导致您的方法抛出异常的NaN值。
所以你必须处理NaN - 你希望你的代码如何转换NaN?到'NaN'
?
这种方式比NaN更具特殊价值。如果您不想要NaN值,则可以使用dropna
。如果您想要一些其他值(或字符串值) - 您可以使用.fillna('NaN')
。如果你想保留NaN以备将来使用(这似乎是我的方式) - 只需在你的lambda上有一个特殊的情况,这将使它们成为NaN:
from pandas import isnull
lambda sentence: sentence if isnull(sentence) else \
''.join(word for word in sentence if ord(word) < 128)