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     │

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...