Pyarrow:TypeError:需要整数(得到类型为str)

3

我有一个数据框,其数据类型如下:

[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)写入parquet文件时,列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列中的元素类型是什么?它们都是相同类型的吗? - AMC
你可以使用 .astype('str') 显式地将数据类型设置为字符串。 - Steven
逗号可以有几种含义。在一些国家,数字点实际上是逗号。例如:欧洲东部、德国、法国等地使用这种方式。这似乎也是这里的情况。在其他国家,逗号是一个帮助人们更容易理解数量级顺序的辅助符号,用于分隔千位数。1,000,000 表示一百万。但是在这里,123.48 表示这是前一种情况:一百二十三加小数部分。我猜这就是为什么 pandas 无法确定如何理解这些值的原因。 - Arpad Horvath -- Слава Україні
2个回答

4

在Apache Arrow中没有数据类型可用于保存Python对象,因此必须推断支持的强类型数据类型(这在Parquet文件中也是如此)。我建议对valor_adjustado列进行数据清理,以确保所有值都是数字(可能存在字符串或其他错误的值)。


2

在使用 pandas.merge 合并数据后,我发现结果中有几列包含了不同的数据类型,导致出现错误。

通过显式地更改数据类型解决了这个问题(可能会有更加优雅的解决方法)。

for col in int_cols:
   df[col] = df[col].astype(int, copy=False)

# now succeeds
df.to_feather(fn)

我在处理一列字符串时犯了一个错误,错误地认为它们已经是日期时间格式了。应用“.to_datetime()”解决了这个问题,但由于pyarrow的错误消息不是“需要日期时间,得到了字符串”,所以我花了一些时间进行调试。 - Tunneller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接