Pandas 使用python引擎读取csv的dask数据帧不可靠行为
我的数据是一个10GB的文件,格式如下:Pandas 使用python引擎读取csv的dask数据帧不可靠行为,pandas,dask,dask-dataframe,Pandas,Dask,Dask Dataframe,我的数据是一个10GB的文件,格式如下: [ 1234567890 ][ 2020052701020201 ][ value1 ][ value2 ][ key3 = value3 ]...[ keyn = valuen ] 注: 可以有任意数量的[key=value]块 字符[和]在值本身中,例如:[hello=wo[rld]] 我无法控制abinput文件,除非我可以在脚本中更改/处理它 我只需要几个列,但是它们的值中有字符[和] 在我的f:函数中的行的简单中,我可以按']['模式进行分割
[ 1234567890 ][ 2020052701020201 ][ value1 ][ value2 ][ key3 = value3 ]...[ keyn = valuen ]
注:
[
和]
在值本身中,例如:[hello=wo[rld]]
[
和]
中,我可以按']['
模式进行分割。但是考虑到文件的大小,dask非常有利可图
我知道使用engine='c'
我不能使用多字符分隔符,但是切换到engine='python'
会导致不可预测的结果。下面是一个示例:
def init_ddf(文件名):
返回ddf.read\u csv(
文件名,
blocksize=“1GB”,
sep=“]”,
usecols=[1,8],
na_过滤器=错误,
名称=[“你好,世界”],
engine=“c”,
)
上述代码按预期会导致ParserError:指定的列太多:预期为25列,发现为24列
。此错误很难重现,因为它只发生在一些我很难识别的特定行中。并非每次有更多列时都会发生。因此在上述函数中,我更改了:engine=“python>“
和sep=“\]\[”
。这对我测试的小样本数据有效。但在10G文件中,我得到以下不可预测的行为:
def init_pyddf(文件名、usecols、名称):
返回ddf.read\u csv(
文件名,
blocksize=“1GB”,
sep=“\]\[”,
usecols=usecols,
na_过滤器=错误,
名称=名称,
engine=“python”,
)
[50]中的:!head/tmp/foo/tmp/bar
==>/tmp/foo/tmp/bar鉴于您有一个更复杂的基于文本的文件格式,您可能首先从Dask Bag开始,使用普通Python函数生成Python字典,然后使用to_Dataframe
方法将该文件包转换为Dask数据帧
import dask.bag
b = dask.bag.read_text("my-files.*.txt")
def parse(line: str) -> dict:
...
records = b.map(parse)
df = b.to_dataframe()
鉴于您有一个更复杂的基于文本的文件格式,您可以首先从Dask Bag开始,使用普通Python函数生成Python字典,然后使用to_Dataframe
方法将该文件包转换为Dask数据帧
import dask.bag
b = dask.bag.read_text("my-files.*.txt")
def parse(line: str) -> dict:
...
records = b.map(parse)
df = b.to_dataframe()