Dataframe 为每个ID分配唯一值
我需要以升序将每个Dataframe 为每个ID分配唯一值,dataframe,julia,Dataframe,Julia,我需要以升序将每个id替换为唯一值 数据 df = DataFrame(id=[1,1,1,3,3,3,4,4,4,7,7,7], time=[0,1,2,0,1,2,0,1,2,0,1,2], conc=[missing,100,70,missing,60,40, missing,90,80, missing,99,70]) 输出 df1 = DataFrame(id=[1,1,1,2,2,2,3,3,3,4,4,4],
id
替换为唯一值
数据
df = DataFrame(id=[1,1,1,3,3,3,4,4,4,7,7,7],
time=[0,1,2,0,1,2,0,1,2,0,1,2],
conc=[missing,100,70,missing,60,40, missing,90,80, missing,99,70])
输出
df1 = DataFrame(id=[1,1,1,2,2,2,3,3,3,4,4,4],
time=[0,1,2,0,1,2,0,1,2,0,1,2],
conc=[missing,100,70,missing,60,40, missing,90,80, missing,99,70])
我尝试使用这个循环,但是当我尝试编织文档时,这个循环失败了
f = 0
df.id = 0
for b = 1:nrow(df)
if df.time[b] == 0
f = f + 1
df.id[b] = f
else
df.id[b] = f
end
end
您的循环通常是正确的,但在Julia中,当您要为数据帧或矩阵的列指定值时,您正在进行boardcasting,并且boardcasting操作需要在运算符之前或函数名称之后添加一个点。因此,将df.id分配给0的正确方法是
df.id.=0
除了@hhilrun的上述注释之外,以下是一些简单的方法来完成您想要的操作(我在每种情况下都创建一个新的数据帧,以避免覆盖源数据帧)
备选案文1。使用StatsBase.jl
julia> using StatsBase
julia> transform(df, :id => denserank => :id)
12×3 DataFrame
Row │ id time conc
│ Int64 Int64 Int64?
─────┼───────────────────────
1 │ 1 0 missing
2 │ 1 1 100
3 │ 1 2 70
4 │ 2 0 missing
5 │ 2 1 60
6 │ 2 2 40
7 │ 3 0 missing
8 │ 3 1 90
9 │ 3 2 80
10 │ 4 0 missing
11 │ 4 1 99
12 │ 4 2 70
备选案文2。使用拆分应用联合收割机:
julia> df2 = copy(df);
julia> df2.id = groupindices(groupby(df2, :id));
julia> df2
12×3 DataFrame
Row │ id time conc
│ Int64? Int64 Int64?
─────┼────────────────────────
1 │ 1 0 missing
2 │ 1 1 100
3 │ 1 2 70
4 │ 2 0 missing
5 │ 2 1 60
6 │ 2 2 40
7 │ 3 0 missing
8 │ 3 1 90
9 │ 3 2 80
10 │ 4 0 missing
11 │ 4 1 99
12 │ 4 2 70
备选案文3。使用cumsum
:
julia> df3 = copy(df);
julia> df3.id = cumsum(df3.time .== 0);
julia> df3
12×3 DataFrame
Row │ id time conc
│ Int64 Int64 Int64?
─────┼───────────────────────
1 │ 1 0 missing
2 │ 1 1 100
3 │ 1 2 70
4 │ 2 0 missing
5 │ 2 1 60
6 │ 2 2 40
7 │ 3 0 missing
8 │ 3 1 90
9 │ 3 2 80
10 │ 4 0 missing
11 │ 4 1 99
12 │ 4 2 70
备选案文4。使用累计:
julia> df4 = copy(df);
julia> df4.id = accumulate((x, y) -> x + (y == 0), df4.time, init=0);
julia> df4
12×3 DataFrame
Row │ id time conc
│ Int64 Int64 Int64?
─────┼───────────────────────
1 │ 1 0 missing
2 │ 1 1 100
3 │ 1 2 70
4 │ 2 0 missing
5 │ 2 1 60
6 │ 2 2 40
7 │ 3 0 missing
8 │ 3 1 90
9 │ 3 2 80
10 │ 4 0 missing
11 │ 4 1 99
12 │ 4 2 70
请注意,选项3和选项4仅依赖于:time
列的特殊结构,而选项1和选项2仅依赖于:id
列中存储的值。
还要注意,在选项3和选项4中,您可以使用cumsum代码>和累计
对列:id
执行就地赋值