Julia ArgumentError:未找到键列取消堆栈错误?
我有一个类似下面的df 样本输入:Julia ArgumentError:未找到键列取消堆栈错误?,julia,julia-dataframe,Julia,Julia Dataframe,我有一个类似下面的df 样本输入: 4×2 DataFrame │ Row │ col1 │ col2 │ │ │ String │ Int64 │ ├─────┼────────┼───────┤ │ 1 │ l1 │ 1 │ │ 2 │ l2 │ 2 │ │ 3 │ l1 │ 3 │ │ 4 │ l2 │ 4 │ 我想把上面的df转换成下面这样 预期df: 2×2 DataFrame │ Row
4×2 DataFrame
│ Row │ col1 │ col2 │
│ │ String │ Int64 │
├─────┼────────┼───────┤
│ 1 │ l1 │ 1 │
│ 2 │ l2 │ 2 │
│ 3 │ l1 │ 3 │
│ 4 │ l2 │ 4 │
我想把上面的df转换成下面这样
预期df:
2×2 DataFrame
│ Row │ l1 │ l2 │
│ │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1 │ 1 │ 2 │
│ 2 │ 3 │ 4 │
我尝试了unstack方法
unstack(df,“col1”,“col2”)
,但是我得到了ArgumentError:没有找到键列。我明白,没有钥匙是不可能解开的。如何将上述df转换为预期df?DataFrames.jl要求您为行指定键,以便通过这些键执行匹配:
julia> df = DataFrame(col1=["l1", "l2", "l1", "l2"], col2=1:4, rowkey=[1,1,2,2])
4×3 DataFrame
│ Row │ col1 │ col2 │ rowkey │
│ │ String │ Int64 │ Int64 │
├─────┼────────┼───────┼────────┤
│ 1 │ l1 │ 1 │ 1 │
│ 2 │ l2 │ 2 │ 1 │
│ 3 │ l1 │ 3 │ 2 │
│ 4 │ l2 │ 4 │ 2 │
julia> unstack(df, "col1", "col2")
2×3 DataFrame
│ Row │ rowkey │ l1 │ l2 │
│ │ Int64 │ Int64? │ Int64? │
├─────┼────────┼────────┼────────┤
│ 1 │ 1 │ 1 │ 2 │
│ 2 │ 2 │ 3 │ 4 │
为什么??假设您的数据如下所示:
julia> df = DataFrame(col1=["l1", "l2", "l1", "l2","l1"], col2=1:5, rowkey=[1,1,3,3,2])
5×3 DataFrame
│ Row │ col1 │ col2 │ rowkey │
│ │ String │ Int64 │ Int64 │
├─────┼────────┼───────┼────────┤
│ 1 │ l1 │ 1 │ 1 │
│ 2 │ l2 │ 2 │ 1 │
│ 3 │ l1 │ 3 │ 3 │
│ 4 │ l2 │ 4 │ 3 │
│ 5 │ l1 │ 5 │ 2 │
julia> unstack(df, "col1", "col2")
3×3 DataFrame
│ Row │ rowkey │ l1 │ l2 │
│ │ Int64 │ Int64? │ Int64? │
├─────┼────────┼────────┼─────────┤
│ 1 │ 1 │ 1 │ 2 │
│ 2 │ 2 │ 5 │ missing │
│ 3 │ 3 │ 3 │ 4 │
如果没有:rowkey
,则无法判断是否确实希望:l2
中的第二行包含缺少的值
这就是unstack
的工作原理,因为它是一个通用函数,所以它使用行键来执行匹配。如果您想要的是假设:
- 所有组的顺序相同
- 所有组的长度都相同
写下:
julia> DataFrame([first(sdf.col1) => sdf.col2 for sdf in groupby(df, :col1)])
2×2 DataFrame
│ Row │ l1 │ l2 │
│ │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1 │ 1 │ 2 │
│ 2 │ 3 │ 4 │
或者更一般的模式
julia> DataFrame([key.col1 => sdf.col2 for (key, sdf) in pairs(groupby(df, :col1))])
2×2 DataFrame
│ Row │ l1 │ l2 │
│ │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1 │ 1 │ 2 │
│ 2 │ 3 │ 4 │
完美的解释。谢谢你的回答。