Python 将 Pandas 浮点数转换为字符串

0 投票
1 回答
2073 浏览
提问于 2025-04-19 19:55

你好,我有一个数据框(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)

撰写回答