Python 使用Apache Parquet的第一步出现类型错误
在第一次尝试apacheparquet文件格式时,遇到了这个类型错误,这让我感到非常困惑。拼花地板不应该支持Pandas所支持的所有数据类型吗?我错过了什么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) 提出: -
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')