如何解决ArgumentError:未找到键列Unstack Error?
我有一个如下所示的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 │ l1 │ l2 │
│ │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1 │ 1 │ 2 │
│ 2 │ 3 │ 4 │
我尝试了非堆叠方法unstack(df,"col1","col2")
,但得到了ArgumentError: No key column found
。我知道没有密钥就无法堆叠。如何将上述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","l1"],col2=1:5,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,"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 │
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。