我经常使用dask.dataframe
来读取多个文件,如下所示:
import dask.dataframe as dd
df = dd.read_csv('*.csv')
然而,每一行的起源,即从中读取数据的文件,似乎永远都会丢失。
有没有办法将其添加为列,例如如果df.loc[:100, 'partition'] = 'file1.csv'
是第一个文件且包含100行,则file1.csv
。这将适用于每个"分区"当作为工作流程的一部分触发compute
时,/ file被读入数据框。
这个想法是可以根据来源应用不同的逻辑。
答案 0 :(得分:3)
Dask函数read_csv,read_table和read_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
的组合。