dataframe - 无法过滤从箭头表创建的 DataFrame
问题描述
我在 julia 中有以下功能,可以读取 Arrow 文件(使用 Arrow.jl)从磁盘读取数据并进行处理:
function getmembershipsdays(fromId, toId)
memberships = Arrow.Table("HouseholdMemberships.arrow") |> DataFrame
filter!([:IndividualId] => id -> id >= fromId && id <= toId, memberships)
...
end
> Error: ERROR: LoadError: MethodError: no method matching
> deleteat!(::Arrow.Primitive{Int64,Array{Int64,1}}, ::Array{Int64,1})
The DataFrame has the following structure:
123226x10 DataFrame
Row | MembershipId | IndividualId | HouseholdId | ...
| Int64 | Int64 | Int64 |
函数中用于单步执行 Dataframe 的其余代码有效,但如果我添加过滤条件,则会出现此错误。就好像 Dataframe 列没有转换为基础 julia 类型。
如果我做
m = filter([:IndividualId] => id -> id >= fromId && id <= toId, memberships)
然后它工作。如何就地过滤?
解决方案
您正在使用内存映射,这意味着您无法就地调整DataFrame
从 Arrow.jl 源创建的大小。这是您必须为从 Arrow 源极快地创建数据帧的零拷贝而付出的成本。
为什么要这样设计?
- 很多时候你只读取数据帧(不改变它们)——在这种情况下,你可能想节省复制数据的成本(特别是对于非常大的数据集)。
- 在 DataFrames.jl 中使用复制函数来执行复制很容易(例如在您的示例中替换
filter!
为filter
)。
有关更多示例,请参见https://bkamins.github.io/julialang/2020/11/06/arrow.html(特别是 - 如何避免使用IO
源而不是文件名作为源进行内存映射)。
PS。注意id >= fromId && id <= toId
可以写成fromId <= id <= toId
。
推荐阅读
- javascript - 更改标题属性的字体系列
- vb.net - 在 rdlc 报告表行中显示动态外部图像
- apache-kafka-streams - 如何在处理器 API 中创建 GlobalKTable?
- amazon-web-services - AWS ELB 粘性导致 NGINX 具有无缓存行为
- android - 通过单击 nav_header_main 更改片段
- typescript - 如何在打字稿中调用自有函数
- java - 如何在 IntelliJ IDEA 调试器中检查线程是否为守护线程?
- c# - HTML 帮助程序中的第二个 lambda 表达式引发 CS0411
- c++ - 为什么 C++ 允许抛出任何东西?
- docker - 如何在 docker-php api 中的 docker execstart 中进行标准输入