gpt4 book ai didi

python - 附加到 HDFStore 失败,返回 "cannot match existing table structure"

转载 作者:太空狗 更新时间:2023-10-30 02:31:05 24 4
gpt4 key购买 nike

最终的解决方案是使用 read_csv 的“converters”参数并在将其添加到 DataFrame 之前检查每个值。最终80多GB的原始数据只有2个破值。

参数看起来像这样:

converters={'XXXXX': self.parse_xxxxx}

像这样的小型静态辅助方法:

@staticmethod
def parse_xxxxx(input):
if not isinstance(input, float):
try:
return float(input)
except ValueError:
print "Broken Value: ", input
return float(0.0)
else:
return input

在尝试阅读 ca 时。将 40GB 以上的 csv 数据放入 HDF 文件中 我遇到了一个令人困惑的问题。读取大约 1GB 后,整个过程失败并出现以下错误

File "/usr/lib/python2.7/dist-packages/pandas/io/pytables.py", line 658, in append
self._write_to_group(key, value, table=True, append=True, **kwargs)
File "/usr/lib/python2.7/dist-packages/pandas/io/pytables.py", line 923, in write_to_group
s.write(obj = value, append=append, complib=complib, **kwargs)
File "/usr/lib/python2.7/dist-packages/pandas/io/pytables.py", line 2985, in write **kwargs)
File "/usr/lib/python2.7/dist-packages/pandas/io/pytables.py", line 2675, in create_axes
raise ValueError("cannot match existing table structure for [%s] on appending data" % items)
ValueError: cannot match existing table structure for [Date] on appending data

我使用的 read_csv 调用如下:

pd.io.parsers.read_csv(filename, sep=";|\t", compression='bz2', index_col=False, header=None, names=['XX', 'XXXX', 'Date', 'XXXXX'], parse_dates=[2], date_parser=self.parse_date, low_memory=False, iterator=True, chunksize=self.input_chunksize, dtype={'Date': np.int64})

当我明确地将 dtype 设置为 int64 时,为什么新 block 的“日期”列不适合现有列?

感谢您的帮助!

下面是解析日期的函数:

@staticmethod
def parse_date(input_date):
import datetime as dt
import re

if not re.match('\d{12}', input_date):
input_date = '200101010101'

timestamp = dt.datetime.strptime(input_date, '%Y%m%d%H%M')
return timestamp

在遵循 Jeff 的一些提示后,我可以提供有关我的问题的更多详细信息。这是我用来加载 bz2 编码文件的完整代码:

iterator_data = pd.io.parsers.read_csv(filename, sep=";|\t", compression='bz2', index_col=False, header=None,
names=['XX', 'XXXX', 'Date', 'XXXXX'], parse_dates=[2],
date_parser=self.parse_date, iterator=True,
chunksize=self.input_chunksize, dtype={'Date': np.int64})
for chunk in iterator_data:
self.data_store.append('huge', chunk, data_columns=True)
self.data_store.flush()

csv 文件遵循以下模式:{STRING};{STRING};{STRING}\t{INT}

为输出文件调用的 ptdump -av 的输出如下:

ptdump -av datastore.h5
/ (RootGroup) ''
/._v_attrs (AttributeSet), 4 attributes:
[CLASS := 'GROUP',
PYTABLES_FORMAT_VERSION := '2.0',
TITLE := '',
VERSION := '1.0']
/huge (Group) ''
/huge._v_attrs (AttributeSet), 14 attributes:
[CLASS := 'GROUP',
TITLE := '',
VERSION := '1.0',
data_columns := ['XX', 'XXXX', 'Date', 'XXXXX'],
encoding := None,
index_cols := [(0, 'index')],
info := {'index': {}},
levels := 1,
nan_rep := 'nan',
non_index_axes := [(1, ['XX', 'XXXX', 'Date', 'XXXXX'])],
pandas_type := 'frame_table',
pandas_version := '0.10.1',
table_type := 'appendable_frame',
values_cols := ['XX', 'XXXX', 'Date', 'XXXXX']]
/huge/table (Table(167135401,), shuffle, blosc(9)) ''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"XX": StringCol(itemsize=16, shape=(), dflt='', pos=1),
"XXXX": StringCol(itemsize=16, shape=(), dflt='', pos=2),
"Date": Int64Col(shape=(), dflt=0, pos=3),
"XXXXX": Int64Col(shape=(), dflt=0, pos=4)}
byteorder := 'little'
chunkshape := (2340,)
autoIndex := True
colindexes := {
"Date": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
"index": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
"XXXX": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
"XXXXX": Index(6, medium, shuffle, zlib(1)).is_CSI=False,
"XX": Index(6, medium, shuffle, zlib(1)).is_CSI=False}
/huge/table._v_attrs (AttributeSet), 23 attributes:
[XXXXX_dtype := 'int64',
XXXXX_kind := ['XXXXX'],
XX_dtype := 'string128',
XX_kind := ['XX'],
CLASS := 'TABLE',
Date_dtype := 'datetime64',
Date_kind := ['Date'],
FIELD_0_FILL := 0,
FIELD_0_NAME := 'index',
FIELD_1_FILL := '',
FIELD_1_NAME := 'XX',
FIELD_2_FILL := '',
FIELD_2_NAME := 'XXXX',
FIELD_3_FILL := 0,
FIELD_3_NAME := 'Date',
FIELD_4_FILL := 0,
FIELD_4_NAME := 'XXXXX',
NROWS := 167135401,
TITLE := '',
XXXX_dtype := 'string128',
XXXX_kind := ['XXXX'],
VERSION := '2.6',
index_kind := 'integer']

经过大量额外的调试后,我遇到了以下错误:

ValueError: invalid combinate of [values_axes] on appending data [name->XXXX,cname->XXXX,dtype->int64,shape->(1, 10)] vs current table [name->XXXX,cname->XXXX,dtype->string128,shape->None]

然后我尝试通过添加修改 read_csv 调用来修复此问题,以便为 XXXX 列强制使用正确的类型,但我收到了相同的错误:

dtype={'XXXX': 's64', 'Date': dt.datetime})

read_csv 忽略了 dtype 设置还是我在这里遗漏了什么?

当读取 block 大小为 10 的数据时,最后 2 个 chunk.info() 调用给出以下输出:

Int64Index: 10 entries, 0 to 9
Data columns (total 4 columns):
XX 10 non-null values
XXXX 10 non-null values
Date 10 non-null values
XXXXX 10 non-null values
dtypes: datetime64[ns](1), int64(1), object(2)<class 'pandas.core.frame.DataFrame'>
Int64Index: 10 entries, 0 to 9
Data columns (total 4 columns):
XX 10 non-null values
XXXX 10 non-null values
Date 10 non-null values
XXXXX 10 non-null values
dtypes: datetime64[ns](1), int64(2), object(1)

我使用的是 pandas 版本 0.12.0

最佳答案

好的,你有几个问题:

  • 当指定要传递给read_csv 的数据类型时,它们必须是 numpy 数据类型;和字符串 dtypes 被转换为 object dtype(所以 s64 不做任何事情)。 datetime 也没有,这就是 parse_dates 的用途。

  • 不同 block 中的 dtype 是不同的,即第一个 block 中有 2 个 int64 列和 1 个 object,而第二个 block 中有 1 个 int64 和 2 个 object。这是你的问题。 (我认为错误消息可能有点令人困惑,IIRC 在更高版本的 pandas 中已修复)。

因此,您需要使每个 block 中的数据类型都相同。您可能在该特定列中有混合数据。一种方法是指定 dtype = { column_that_is_bad : 'object' }。另一种方法是在该列上使用 convert_objects(convert_numeric=True) 将所有非数字值强制转换为 nan(这也会将列的 dtype 更改为 float64).

关于python - 附加到 HDFStore 失败,返回 "cannot match existing table structure",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23770260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com