微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法过滤从箭头表创建的 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)

然后就可以了。如何就地过滤?

解决方法

您正在使用内存映射,这意味着您无法就地调整从 Arrow.jl 源创建的 DataFrame 的大小。这是您必须为从 Arrow 源超快速零拷贝创建数据帧而支付的成本。

为什么要这样设计?

  1. 通常您只读取数据帧(而不对其进行变异)——在这种情况下,您可能希望节省复制数据的成本(尤其是对于非常大的数据集)。
  2. 在 DataFrames.jl 中使用复制函数来执行复制很容易(例如在您的示例中将 filter! 替换为 filter)。

有关更多示例,请参见 https://bkamins.github.io/julialang/2020/11/06/arrow.html(特别是 - 如何避免使用 IO 源而不是文件名作为源进行内存映射)。

附注。请注意,id >= fromId && id <= toId 可以只写为 fromId <= id <= toId

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?