Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 使用python引擎读取csv的dask数据帧不可靠行为_Pandas_Dask_Dask Dataframe - Fatal编程技术网

Pandas 使用python引擎读取csv的dask数据帧不可靠行为

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:函数中的行的简单中,我可以按']['模式进行分割

我的数据是一个10GB的文件,格式如下:

[ 1234567890 ][ 2020052701020201 ][ value1 ][ value2 ][ key3 = value3 ]...[ keyn = valuen ]
注:

  • 可以有任意数量的[key=value]块
  • 字符
    [
    ]
    在值本身中,例如:
    [hello=wo[rld]]
  • 我无法控制abinput文件,除非我可以在脚本中更改/处理它
  • 我只需要几个列,但是它们的值中有字符
    [
    ]
  • 在我的f:函数中的行的简单
    中,我可以按
    ']['
    模式进行分割。但是考虑到文件的大小,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()