【问题标题】:Pyarrow: TypeError: an integer is required (got type str)Pyarrow:TypeError:需要一个整数(获取类型 str)
【发布时间】:2020-02-06 22:23:46
【问题描述】:

我有一个具有以下 dtype 的数据框:

[2020-02-06 19:15:06,579] {logging_mixin.py:95} INFO - 
campanha                      object
chave_sistema_origem           int64
valor_ajustado                object

当我尝试使用df.to_parquet(buffer, index=False) 编写镶木地板文件时,valor_ajustado 列的某些值会引发异常

[2020-02-06 19:15:06,597] {taskinstance.py:1047} ERROR - an integer is required (got type str)
...
  File "/Users/jackhammer/.virtualenvs/python373/lib/python3.7/site-packages/pyarrow/pandas_compat.py", line 540, in convert_column
    result = pa.array(col, type=type_, from_pandas=True, safe=safe)
  File "pyarrow/array.pxi", line 207, in pyarrow.lib.array
  File "pyarrow/array.pxi", line 78, in pyarrow.lib._ndarray_to_array

我知道valor_ajustado 列的值如下:

0

123,48

1

493,987

任何人都知道为什么它试图操纵整数而不是将列保留为对象?

【问题讨论】:

  • valor_ajustado 列中的元素是什么类型?它们都是同一类型吗?
  • 您可以使用 .astype('str') 来显式使用字符串作为数据类型。

标签: python pandas parquet


【解决方案1】:

Apache Arrow 中没有数据类型来保存 Python 对象,因此必须推断支持的强数据类型(Parquet 文件也是如此)。我会清理valor_adjustado 列以确保所有值都是数字(其中必须有一个字符串或其他一些错误值)。

【讨论】:

    【解决方案2】:

    我在执行pandas.merge 后发现了这个错误,该pandas.merge 产生了一个包含多列混合数据类型的数据框。

    通过显式类型更改修复(可能有更优雅的方式来做到这一点)

    for col in int_cols:
       df[col] = df[col].astype(int, copy=False)
    
    # now succeeds
    df.to_feather(fn)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      相关资源
      最近更新 更多