【问题标题】:How to read every nth row using Dask read_csv for fast multiple reading in multiple files?如何使用 Dask read_csv 读取每 n 行以快速读取多个文件?
【发布时间】:2021-05-01 18:56:42
【问题描述】:

我正在尝试将多个 CSV 文件读入单个数据帧。虽然这可以使用列表理解和 Panda 的 concat 函数,例如

import pandas as pd
files = ['file1.csv', 'file2.csv', etc....]
all_df = []
for filename in files:
    all_df.append(pd.read_csv(filename))
df = pd.concat(all_df)

当文件是长列表(例如 100 多个项目)时,我发现这太慢了。

我尝试过使用 Dask,它接受列表作为输入并具有内置的并行化以提高速度,例如

import dask.dataframe as dd
df_dask = dd.read_csv(files)
df = df_dask.compute()

这可以提高约 2 倍的速度。

但是,为了进一步加快速度,我希望能够仅读取文件的每第 N 行。

使用 Pandas,我可以使用 lambda 函数和 read_csv 的 skiprows 参数来执行此操作。例如 cond = lambda x : x % downsampling != 0 并在循环中使用 pd.read_csv(filename, skiprows=cond)

但是,这不适用于 Dask,并且 skiprows 参数不接受 lambda 函数。我不能将整数传递给skiprows,因为每个文件都有不同的长度,因此每个文件要跳过的行不同。

有没有快速的解决方案?我认为某种与 Dask 兼容的下采样操作可能是一种解决方案,但不确定如何实施。

请问可以吗?

【问题讨论】:

  • 看看 dask 延迟接口,您可以使用跳过线实现您的 pandas 读取,然后使用 dask 延迟将其并行化。
  • 感谢您的建议。我不太确定这将如何工作 - 我认为加速来自使用 Dask 而不是 Pandas 进行加载?

标签: python pandas dataframe bigdata dask


【解决方案1】:

详细说明@quizzical_panini 使用dask.delayed 的建议:

import dask
import pandas as pd

@dask.delayed
def custom_pandas_load(file_path):
     # do what you would do if you had one file
    cond = lambda x : x % downsampling != 0
    df = pd.read_csv(file_path, skiprows=cond)
    return df

[computed_dfs] = dask.compute(
    [custom_pandas_load(file_path)
     for file_path in files]
)

df_final = pd.concat(computed_dfs)

【讨论】:

  • 谢谢。恐怕它不起作用。 computed_dfs 包含数据列表,而不是数据帧,因此 pd.concat 返回错误。此外,这里增加下采样并没有加快速度,而单独使用 Pandas 则有。因此,也许 Dask 在处理skirows 方面效率较低?
  • 请将上述代码仅作为建议,您需要针对特定​​用例编写和测试延迟函数。 dask.delayed 在处理特定功能时通常不会提高/降低效率,它只是并行化工作流程的一种手段,因此并行化的收益将取决于您拥有多少核心,以及延迟函数的构建方式。
  • 好的,谢谢,在这种情况下,使用 Dask 似乎会受到惩罚而不是收益,因为我需要转换列表 --> 数据帧,增加更多的处理成本。还是谢谢
  • 不,我认为如果你跳过很多行会有好处。 computed_dfs 将包含一个数据帧列表,但连接它们应该快速/容易。如果您没有在computed_dfs 中获得数据帧列表,那么我建议您在一个/两个文件上运行延迟函数并确保它返回一个数据帧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多