如何在Julia中为分组后的子DataFrame生成行序号
Julia DataFrame分组生成组内递增序号解决方法
你当前代码里用nrow => :seq只会返回每个分组的总行数,所以每个组的所有行seq值相同(你这里显示全为1,说明每个分组仅包含1行)。要实现组内行从1开始递增的序号,需针对每个分组的子DataFrame生成连续索引序列,以下是两种可行方案:
方案一:使用transform保留原数据结构
transform会保留原DataFrame的所有行,直接添加新的seq列,适合需要保留全量数据的场景:
# 先分组,再为每个组生成从1开始的序号 currentDF = transform(groupby(currentDF, [:TOID, :Lane, :SectionLabel, :Chainage]), _ -> 1:nrow(_) => :seq) # 如果需要先对组内数据排序,再生成序号: currentDF = transform(groupby(currentDF, [:TOID, :Lane, :SectionLabel, :Chainage])) do sdf sorted_sdf = sort(sdf, [:TOID, :Lane, :SectionLabel, :Chainage]) sorted_sdf.seq = 1:nrow(sorted_sdf) return sorted_sdf end
方案二:使用combine自定义处理逻辑
如果需要对分组数据做更多自定义操作,可在combine的匿名函数里完成排序和序号生成:
grouped_currentDF = combine(groupby(currentDF, [:TOID, :Lane, :SectionLabel, :Chainage])) do sdf # 先对组内数据排序 sorted_sdf = sort(sdf, [:TOID, :Lane, :SectionLabel, :Chainage]) # 添加seq列,赋值为1到组内行数的序列 sorted_sdf[!, :seq] = 1:nrow(sorted_sdf) return sorted_sdf end # 提取需要的列 extract = select(grouped_currentDF, [:seq, :TOID, :Lane, :SectionLabel, :Chainage])
核心逻辑是:针对每个分组的子DataFrame,生成1:nrow(sdf)这样的连续整数序列,将其赋值给seq列,就能实现每个组内序号从1开始递增的效果。
内容的提问来源于stack exchange,提问作者Roy Jaques
相关产品推荐
相关产品推荐

