gpt4 book ai didi

python - 如何将 pandas.Series 的混合字节/字符串转换/解码为字符串或 utf-8

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:09 25 4
gpt4 key购买 nike

我想在两种可能的情况下解决问题:

  1. 我事先不知道字符串系列是 UTF-8 还是字节。

  2. pd.Series 中的字符串是混合字节和 `UTF-8/。

我猜这会有相同的解决方案。

目前:

b = pd.Series(['123', '434,', 'fgd', 'aas', b'442321'])
b.str.decode('utf-8')

给出 NaNs,其中字符串已经是 UTF-8 格式。或者它们是自动的 ASCII 码?例如,我可以在 decode 中提供 error 参数,以便字符串在已经采用 UTF-8 的情况下保持“未解码”状态吗?文档字符串似乎没有提供太多信息。

或者是否有更好的方法来实现这一点?

或者,在 pandas 中是否有类似 .str.decode 的字符串方法,当字符串为 bytesUTF- 时,它只返回 True/False 8?

编辑:

我能想到的一种选择是:

b = pd.Series(['123', '434,', 'fgd', 'aas', b'442321'])
converted = b.str.decode('utf-8')
b.loc[~converted.isnull()] = converted

这是推荐的方式吗?好像有点迂回。我想更优雅的方法实际上只是一种检查 str 是否是 Series 的所有元素上的字节并返回 bool 数组的方法。

最佳答案

对于大型系列来说,这肯定会减慢速度,但您可以传递一个带有可调用对象的三元表达式:

>>> b.apply(lambda x: x.decode('utf-8') if isinstance(x, bytes) else x)                                                                                                                                                                                      
0 123
1 434,
2 fgd
3 aas
4 442321
dtype: object

查看 .str.decode() 的源代码很有启发性 - 它只是将 _na_map(f, arr) 应用于系列,其中函数 ff = lambda x: x.decode(encoding, errors)。因为 str 没有开始的“解码”方法,所以该错误将变为 NaN。这发生在 str_decode() .

>>> from pandas.core.strings import str_decode                                                                                                                                                                                                               
>>> from pandas.core.strings import _cpython_optimized_encoders

>>> "utf-8" in _cpython_optimized_encoders
True
>>> str_decode(b, "utf-8")
array([nan, nan, nan, nan, '442321'], dtype=object)

>>> from pandas.core.strings import _na_map
>>> f = lambda x: x.decode("utf-8")
>>> _na_map(f, b)
array([nan, nan, nan, nan, '442321'], dtype=object)

关于python - 如何将 pandas.Series 的混合字节/字符串转换/解码为字符串或 utf-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57361169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com