【发布时间】: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