Polars中如何将字符串列表列转换为字符串并实现哈希处理?
Polars中如何将字符串列表列转换为字符串并实现哈希处理?
我来帮你搞定这个Polars里哈希字符串列表列的问题~
你遇到的报错是因为Polars的hash方法目前不支持直接对List(String)类型的列进行哈希操作,不过我们有两种纯Polars的解决方案,完全不需要依赖Pandas:
方法一:将列表列转为字符串后哈希
我们可以用Polars数组方法arr.to_string()把每个列表序列化为字符串,之后就能正常调用hash方法了,效果和你用Pandas转字符串的方式一致:
import polars as pl list_of_lists = [ ['base', 'base.current base', 'base.current base.inventories - total', 'ABCD'], ['base', 'base.current base', 'base.current base.inventories - total', 'ABCD'], ['base', 'base.current base', 'base.current base.inventories - total', 'ABCD'], ['base', 'base.current base', 'base.current base.inventories - total', 'ABCD'] ] pl_df = pl.DataFrame({'lol': list_of_lists}) result = pl_df.with_columns( pl.col('lol') .arr.to_string() # 将每个列表转为格式化的字符串 .hash(seed=140) .name.suffix('_hashed') ) print(result)
执行后会生成和你Pandas方案一致的哈希值,每个相同的列表都会得到相同的哈希结果。
方法二:转为分类类型(Categorical)哈希
如果你的列里存在混合类型(比如同时有列表、字符串、数字),或者想要更好的性能,推荐把列转为Categorical类型后再哈希。这种方式会给每个唯一的元素分配专属编码,哈希编码后的值稳定性更高:
import polars as pl list_of_lists = [ ['base', 'base.current base', 'base.current base.inventories - total', 'ABCD'], ['base', 'base.current base', 'base.current base.inventories - total', 'DEFG'], ['base', 'base.current base', 'base.current base.inventories - total', 'ABCD'], ['base', 'base.current base', 'base.current base.inventories - total', 'HIJK'], '(bobbyJoe460)', 'bobby, Joe (xx866e)', 137642039575 ] # 用strict=False允许列内存在混合类型 pl_df = pl.DataFrame({'lol': list_of_lists}, strict=False) result = pl_df.with_columns( pl.col('lol') .cast(pl.Categorical) # 转换为分类类型 .hash(seed=140) .name.suffix('_hashed') ) print(result)
这种方法不仅能处理混合类型场景,重复值较多时的性能表现也会优于字符串转换的方式。
备注:内容来源于stack exchange,提问作者MikeB2019x
相关产品推荐
相关产品推荐

