Dask Dataframe按索引加载

时间:2016-11-07 05:27:05

标签: python dask

我有一个pandas数据框,其中包含大量文本文档的元数据:

meta_df = pd.read_csv(
    "./mdenny_copy_early2015/Metadata/Metadata/Bill_Metadata_1993-2014.csv",
    low_memory=False,
    parse_dates=['time'],
    infer_datetime_format=True,
    dayfirst=True,
)

对于其中的每一行,都有JSON文件,其中包含完整的标记化文本。 JSON文件的文件名是它对应的行的索引。我无法一次将所有JSON文件加载到内存中,但能够使用dask.dataframe.from_delayed将它们放入dask数据框中。这会将每个文档放入其自己的分区中:

def doc_paths():
    p = Path('./mdenny_copy_early2015/bills/POS_Tagged_Bills_1993_2014/')
    return p.glob("*.anno")

paths = list(doc_paths())

def load_doc(path):
    with open(str(path.resolve())) as f:
        doc = json.load(f)
        id_ = int(path.stem[4:])
        sentences = [s['tokens'] for s in doc['sentences']]
        print(id_)
        return pd.DataFrame({
            'sentences': [sentences]
        }, index=[id_])

dfs = list(map(delayed(load_doc, pure=True), paths))
df = dask.dataframe.from_delayed(dfs)

然后我可以将它们连接在一起以获得与元数据相关的句子:

joined_df = df.join(meta_df)

但是,如果我执行joined_df[joined_df['author'] == 'Saul'].compute()之类的操作,它会将所有文件加载到内存中。有没有办法我可以设置它只读取它需要的文件?看起来这应该是可能的,因为它已经拥有了内存中的所有元数据,然后可以从中找到所需的ID并在磁盘上查找它们。

0 个答案:

没有答案