pandas 如何在Polars或Pyarrow中获取字符串列的散列

4xrmg8kj  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(76)

我有一个带有字符串键列的Pandas DataFrame/Polars嵌套框架/ Pyarrow表。你可以假设字符串是随机的。我想根据这个键列将该嵌套框架划分为N个较小的嵌套框架。
对于整数列,我可以使用df1 = df[df.key % N == 1]df2 = df[df.key % N == 2]等。
对于如何处理字符串列,我最好的猜测是应用散列函数(例如,对字符串的所有值求和)将其转换为整数列,然后使用模数。
请告诉我在Pandas、Polars或Pyarrow中最有效的方法是什么,最好是在API中使用纯列操作。

laik7k3q

laik7k3q1#

我对@cbilots的回答有一个小小的补充。Polars有一个hash表达式,所以计算分区id是微不足道的。
如果您将其与partition_by合并结合使用,您可以使用以下命令以极快的速度创建分区:

df = pl.DataFrame({
    "strings": ["A", "A", "B", "A"],
    "payload": [1, 2, 3, 4]
})

N = 2
(df.with_columns([
     (pl.col("strings").hash() % N).alias("partition_id")
]).partition_by("partition_id"))

个字符
分区的分组和具体化将并行进行。

bmvo0sr5

bmvo0sr52#

我会尝试使用hash_rows来查看它在您的数据集和计算平台上的性能。(请注意,在计算中,我实际上只选择了key字段并在其上运行hash_rows

N = 50
df = df.with_column(
    pl.lit(df.select(['key']).hash_rows() % N).alias('hash')
)

字符串
我刚刚在一个32核系统上的一个数据集上运行了这个程序,这个数据集有近4900万条记录,它在几秒钟内就完成了(我数据集中的“关键”字段是人们的姓氏)。
我还应该注意,有一个partition_by方法可能对分区有帮助。

相关问题