Julia -如何通过条件找到Julia DataFrame中的特定数据并更改它?



我有一个具有以下结构的DataFrame,例如:

show(q)
2×5 DataFrame
Row │ state   left     right    up       down    
│ Any     Float64  Float64  Float64  Float64
─────┼────────────────────────────────────────────
1 │ (1, 1)      0.0      0.0      0.0      0.0
2 │ (2, 2)      0.0      0.0      0.0      0.0

,其中我使用列state作为索引列,以元组作为索引。我想使用索引访问数据,比如q[q.state .== (1,1), 'down'],我该怎么做?

此外,当我使用这个命令q[q.state .== (1,1), :]访问相应状态的行时,它返回给我一个空的DataFrame:

0×5 DataFrame
Row │ state  left     right    up       down    
│ Any    Float64  Float64  Float64  Float64
─────┴───────────────────────────────────────────

为什么?

首先,您在编写q.state .== (1,1)时犯的错误,因为它产生:

julia> q.state .== (1,1)
2-element BitVector:
0
0

因为(1,1)是广播的

你需要写:

julia> q.state .== Ref((1,1))
2-element BitVector:
1
0

(1,1)视为标量。

现在你有:

julia> q[q.state .== Ref((1,1)), :]
1×5 DataFrame
Row │ state   left  right  up   down
│ Any     Any   Any    Any  Any
─────┼────────────────────────────────
1 │ (1, 1)  0.0   0.0    0.0  0.0

如果你想访问一个数据帧的单个单元格,用查找写:

julia> q[findfirst(==((1,1)), q.state), :down]
0.0

或者如果您更谨慎(并确保只有一个匹配项):

julia> q[only(findall(==((1,1)), q.state)), :down]
0.0

最新更新