Dask数据帧:读取多个文件&将文件名存储在列中

时间:2018-02-14 20:01:32

标签: python pandas dataframe dask

我经常使用dask.dataframe来读取多个文件,如下所示:

import dask.dataframe as dd

df = dd.read_csv('*.csv')

然而,每一行的起源,即从中读取数据的文件,似乎永远都会丢失。

有没有办法将其添加为列,例如如果df.loc[:100, 'partition'] = 'file1.csv'是第一个文件且包含100行,则file1.csv。这将适用于每个"分区"当作为工作流程的一部分触发compute时,/ file被读入数据框。

这个想法是可以根据来源应用不同的逻辑。

2 个答案:

答案 0 :(得分:3)

Dask函数read_csvread_tableread_fwf现在包括参数include_path_column

include_path_column:bool or str, optional
Whether or not to include the path to each particular file.
If True a new column is added to the dataframe called path.
If str, sets new column name. Default is False.

答案 1 :(得分:2)

假设您拥有或可以创建一个file_list列表,其中包含每个csv文件的文件路径,并且每个文件都适合RAM(您提到了100行),那么这应该起作用:

import pandas as pd
import dask.dataframe as dd
from dask import delayed

def read_and_label_csv(filename):
    # reads each csv file to a pandas.DataFrame
    df_csv = pd.read_csv(filename)
    df_csv['partition'] = filename.split('\\')[-1]
    return df_csv

# create a list of functions ready to return a pandas.DataFrame
dfs = [delayed(read_and_label_csv)(fname) for fname in file_list]
# using delayed, assemble the pandas.DataFrames into a dask.DataFrame
ddf = dd.from_delayed(dfs)

当然有一些定制。如果您的csv文件大于RAM,则可以使用dask.DataFrame的组合。