Python 使用Apache Parquet的第一步出现类型错误

Python 使用Apache Parquet的第一步出现类型错误,python,pandas,csv,data-science,parquet,Python,Pandas,Csv,Data Science,Parquet,在第一次尝试apacheparquet文件格式时,遇到了这个类型错误,这让我感到非常困惑。拼花地板不应该支持Pandas所支持的所有数据类型吗?我错过了什么 import pandas import pyarrow import numpy data = pandas.read_csv("data/BigData.csv", sep="|", encoding="iso-8859-1") data_parquet = pyarrow.Table.from_pandas(data) 提出: -

在第一次尝试apacheparquet文件格式时,遇到了这个类型错误,这让我感到非常困惑。拼花地板不应该支持Pandas所支持的所有数据类型吗?我错过了什么

import pandas
import pyarrow
import numpy

data = pandas.read_csv("data/BigData.csv", sep="|", encoding="iso-8859-1")
data_parquet = pyarrow.Table.from_pandas(data)
提出:

---------------------------------------------------------------------------
ArrowInvalid                              Traceback (most recent call last)
<ipython-input-9-90533507bcf2> in <module>()
----> 1 data_parquet = pyarrow.Table.from_pandas(data)

table.pxi in pyarrow.lib.Table.from_pandas()

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pyarrow\pandas_compat.py in dataframe_to_arrays(df, schema, preserve_index, nthreads)
    354             arrays = list(executor.map(convert_column,
    355                                        columns_to_convert,
--> 356                                        convert_types))
    357 
    358     types = [x.type for x in arrays]

~\AppData\Local\Continuum\anaconda3\lib\concurrent\futures\_base.py in result_iterator()
    584                     # Careful not to keep a reference to the popped future
    585                     if timeout is None:
--> 586                         yield fs.pop().result()
    587                     else:
    588                         yield fs.pop().result(end_time - time.time())

~\AppData\Local\Continuum\anaconda3\lib\concurrent\futures\_base.py in result(self, timeout)
    423                 raise CancelledError()
    424             elif self._state == FINISHED:
--> 425                 return self.__get_result()
    426 
    427             self._condition.wait(timeout)

~\AppData\Local\Continuum\anaconda3\lib\concurrent\futures\_base.py in __get_result(self)
    382     def __get_result(self):
    383         if self._exception:
--> 384             raise self._exception
    385         else:
    386             return self._result

~\AppData\Local\Continuum\anaconda3\lib\concurrent\futures\thread.py in run(self)
     54 
     55         try:
---> 56             result = self.fn(*self.args, **self.kwargs)
     57         except BaseException as exc:
     58             self.future.set_exception(exc)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pyarrow\pandas_compat.py in convert_column(col, ty)
    343 
    344     def convert_column(col, ty):
--> 345         return pa.array(col, from_pandas=True, type=ty)
    346 
    347     if nthreads == 1:

array.pxi in pyarrow.lib.array()

array.pxi in pyarrow.lib._ndarray_to_array()

error.pxi in pyarrow.lib.check_status()

ArrowInvalid: Error converting from Python objects to Int64: Got Python object of type str but can only handle these types: integer

在Apache Arrow中,表列的数据类型必须相同。pandas支持Python对象列,其中的值可以是不同的类型。因此,在写入拼花地板格式之前,您需要进行一些数据清理


我们已经在Arrow Python绑定中处理了一些基本情况(比如一列中的字节和unicode),但我们不会对如何处理坏数据进行任何猜测。我打开了JIRA关于在这种情况下添加一个选项来强制意外值为null的文章,这在将来可能会有所帮助。

也有同样的问题,我花了一段时间找到了一种方法来查找有问题的列。下面是我找到混合类型列的方法——尽管我知道一定有更有效的方法

发生异常之前打印的最后一列是混合类型列

# method1: try saving the parquet file by removing 1 column at a time to 
# isolate the mixed type column.
cat_cols = df.select_dtypes('object').columns
for col in cat_cols:
    drop = set(cat_cols) - set([col])
    print(col)
    df.drop(drop, axis=1).reset_index(drop=True).to_parquet("c:/temp/df.pq")
另一次尝试-根据唯一值列出列和每种类型

# method2: list all columns and the types within
def col_types(col):
    types = set([type(x) for x in col.unique()])
    return types

df.select_dtypes("object").apply(col_types, axis=0)

我遇到了类似的情况,如果可能的话,您可以首先将所有
转换为所需的字段数据类型,然后尝试转换为拼花地板。例如:-

import pandas as pd
column_list = df.columns
for col in column_list:
    df[col] = df[col].astype(str)

df.to_parquet('df.parquet.gzip', compression='gzip')

回溯的最后一行表示,Arrow在其预期的
int
位置获取
str
数据。
BigData.csv
的前几行是什么
dtype={“16”:numpy.object}
告诉Panda不要只解释第16列的数据类型,而不要解释其他列的数据类型。如果删除后再试一次会怎么样?删除后,错误保持不变。嗯,好的。你能把
BigData.csv
的前几行添加到问题中吗?我不确定我能添加,因为数据集是保密的。我有一个可能的罪魁祸首:我知道在一列的一行中有一个字符串,否则都是数字的-这会导致错误吗?在我有限的测试中,我无法使用混合类型的列重现您的确切错误消息。对不起,我帮不上忙了!
import pandas as pd
column_list = df.columns
for col in column_list:
    df[col] = df[col].astype(str)

df.to_parquet('df.parquet.gzip', compression='gzip')