【问题标题】:Blaze Data field map throws TypeErrorBlaze Data 字段映射抛出 TypeError
【发布时间】:2016-02-04 23:22:22
【问题描述】:

我最近开始将我的数据探索代码集从 pandas 移动到 blaze。我遇到了以下问题。

假设:

from blaze import *

s = Data([(1, 'Alice', 100),
...           (2, 'Bob', -200),
...           (3, 'Charlie', 300),
...           (4, 'Denis', 400),
...           (5, 'Edith', -500)],
...          fields=['id', 'name', 'balance'])

我们可以通过into 使用pandas.DataFrame 轻松计算如下内容:

into(pd.DataFrame,s).balance.apply(abs)

但是,我在尝试这样做时遇到了严重的困难:

s.balance.map(abs,schema='{b: int64}')

抛出TypeError: a bytes-like object is required, not 'int' 等等。

这个问题似乎与Best approach to apply a function to a column or create a new column by applying a function to another one? 已关闭有关,所以我不知道该去哪里。

ps:如果您觉得这很琐碎并想将问题标记下来,请同时提供完整的工作答案。

【问题讨论】:

  • 我想指出s = transform(s, b = abs(s.balance)) 做了正确的事。但在这个问题中,我使用abs 函数作为一个易于理解的占位符,用于作用于一个变量/字段的任何函数。问题仍然存在,def FindC(word): return word.lower().find('c') 不能像在transform(s,hasC = FindC(s.name)) 中那样使用。这样做我得到AttributeError: 'Field' object has no attribute 'lower'

标签: python blaze


【解决方案1】:

尝试将'int64' 作为datashape 传递,而不是为schema 传递一个值。它是第二个关键字参数,所以你不需要命名它。以下:

from blaze import *
s = Data([(1, 'Alice', 100),
          (2, 'Bob', -200),
          (3, 'Charlie', 300),
          (4, 'Denis', 400),
          (5, 'Edith', -500)],
          fields=['id', 'name', 'balance'])
s.balance.map(abs, 'int64')

为我工作,并产生:

   balance
0      100
1      200
2      300
3      400
4      500

附言尽管从 blaze 导入所有内容似乎会破坏内置的 absblaze.expr.abs,但我认为这并不重要。

【讨论】:

  • 我还是很长的TypeError: a bytes-like object is required, not 'int'
  • 我使用的是blaze 版本0.9.1。你用的是什么版本?
  • 我正在使用0.9.0。我发现在使用list 创建Data 实例后我也遇到了错误,就像您在上面所做的那样。我玩了一下,我认为需要使用datashape 参数,而不是schema。我会更新答案。
猜你喜欢
  • 2017-05-18
  • 1970-01-01
  • 2013-07-05
  • 2023-01-14
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多