我正在尝试在Julia中对DataFrame进行子集化,如下所示:
<link rel="stylesheet" href="https://storage.googleapis.com/non-spec-apps/mio-icons/latest/outline.css">
我希望只返回第二行,但我收到一个错误:
错误:BoundsError:尝试访问“试图访问数据帧 3行,索引为false”
此错误是什么意思,我该如何对DataFrame进行子集化?
答案 0 :(得分:2)
仅提及其他选项,请注意,您可以在此处使用filter
函数:
julia> filter(row -> row.a == 2, df)
1×2 DataFrame
│ Row │ a │ b │
│ │ Int64 │ String │
├─────┼───────┼────────┤
│ 1 │ 2 │ y │
或
julia> df[filter(==(2), df.a), :]
1×2 DataFrame
│ Row │ a │ b │
│ │ Int64 │ String │
├─────┼───────┼────────┤
│ 1 │ 2 │ y │
答案 1 :(得分:0)
幸运的是,您只需要添加一个字符:df = DataFrame(a=[1,2,3], b=["x", "y", "z"])
df2 = df[df.a == 2, :]
。使用.
字符可以在任何Julia功能上进行广播,甚至可以使用.
之类的功能。因此,您的代码如下:
==
在不广播的情况下,子句df = DataFrame(a=[1,2,3], b=["x", "y", "z"])
df2 = df[df.a .== 2, :]
返回df.a == 2
,因为它从字面上将Array [1,2,3](作为一个整体)与标量值2进行比较。 (3,)在不进行广播的情况下永远不会等于2的标量值,因为大小不同。因此,该子句仅返回单个false
。
您收到的错误告诉您您正在尝试访问索引false
处的DataFrame,该索引对于具有3行的DataFrame不是有效索引。通过使用false
进行广播,您现在正在创建形状为(3,)的布尔数组,这是索引具有3行的DataFrame的有效方法。
有关广播的更多信息,请参见Julia的官方文档here。