You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中实现类似PySpark的Window.partitionBy分组排序去重功能

解决方案

你需要的窗口分组排序取行号逻辑,在Python生态最常用的结构化数据处理库Pandas中,可以通过groupby+rank或者groupby+cumcount实现,效果和你给出的PySpark代码完全一致。


测试数据构造

首先构造你示例中的DataFrame:

import pandas as pd

data = {
    "Name": ["Ram", "geet", "ram", "geet", "tom", "hary", "tom"],
    "age": [20, 16, 50, 15, 21, 25, 36]
}
df = pd.DataFrame(data)

# 你的配置参数
partition_col = ["Name"]
arrange_col = ["age"]

单排序字段极简实现

对应你示例中仅按age降序排序的需求,直接用rank方法即可:

df["Value"] = df.groupby(partition_col, group_keys=False)[arrange_col]\
                .rank(method="first", ascending=False)\
                .astype(int)

运行后输出的df和你PySpark的结果完全一致:

NameageValue
Ram201
geet161
ram501
geet152
tom212
hary251
tom361

参数说明

  • groupby(partition_col):对应PySpark的Window.partitionBy(partition_col),按指定列划分分区
  • ascending=False:对应F.desc(c),按指定列降序排序
  • method="first":严格对应row_number()的逻辑:相同值按数据原始出现顺序分配唯一不重复的行号
  • astype(int):将rank默认返回的浮点型结果转为整型,和PySpark输出格式对齐

多排序字段通用写法

如果需要按多个字段排序(支持不同字段设置不同排序方向),可以用先排序再累计计数的方式,完全对齐PySpark的orderBy逻辑:

# 示例:按age降序、其他字段升序的话,sort_orders设置为[False, True]即可
sort_orders = [False] * len(arrange_col) 

# 先按分区列+排序字段排序,分区列默认升序,排序字段按自定义规则
df = df.sort_values(
    by=partition_col + arrange_col,
    ascending=[True]*len(partition_col) + sort_orders
)

# cumcount从0开始计数,加1后和row_number效果一致
df["Value"] = df.groupby(partition_col).cumcount() + 1

内容的提问来源于stack exchange,提问作者gm tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:54:09