如何在百万级数据集的Item3分组内创建行标识符?
问题描述
我有百万行级的如下格式数据,需要新增一列Identifier,用来标记Item3分组内的行序号。前两列仅用于说明数据集中存在其他列,之前试过cumsum和group_indices,但都达不到效果。
原始数据:
| Item1 | Item2 | Item3 |
|---|---|---|
| One | Two | A |
| One | Two | A |
| One | Two | A |
| One | Two | B |
| One | Two | B |
| One | Two | C |
期望输出:
| Item1 | Item2 | Item3 | Identifier |
|---|---|---|---|
| One | Two | A | 1 |
| One | Two | A | 2 |
| One | Two | A | 3 |
| One | Two | B | 1 |
| One | Two | B | 2 |
| One | Two | C | 1 |
解决方案
1. Pandas处理(内存足够时)
百万行数据如果能放进内存,用groupby+cumcount是最直接高效的方式,cumcount会在每个分组内从0开始计数,加1就能得到从1开始的序号:
import pandas as pd # 读取数据(替换成你的数据源) df = pd.read_csv("your_data.csv") # 新增组内行号列 df["Identifier"] = df.groupby("Item3").cumcount() + 1
2. PySpark处理(超大数据量,内存不足时)
如果数据量太大单节点内存放不下,用PySpark的窗口函数实现,能分布式处理:
from pyspark.sql import SparkSession from pyspark.sql.window import Window from pyspark.sql.functions import row_number spark = SparkSession.builder.appName("group_seq").getOrCreate() # 读取数据(替换成你的数据源) df = spark.read.csv("your_data.csv", header=True, inferSchema=True) # 定义窗口:按Item3分组,保持原数据顺序(如果需要指定排序字段,把orderBy里的内容换成你需要的字段,比如主键、时间戳) window = Window.partitionBy("Item3").orderBy(df["Item1"]) # 生成组内行号 df = df.withColumn("Identifier", row_number().over(window)) # 保存结果 df.write.csv("result.csv", header=True)
为什么之前的方法没用?
group_indices只能给每个分组分配一个唯一的组ID,没法生成组内的行序号;- 单纯用
cumsum是全局累计,没有分组逻辑,所以得到的是全局序号,不是组内的。
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

