我有大量的csv数据,我需要处理大约40GB的大小(我们称之为' body')。本机构中每个文件中的数据由单列CSV文件组成。每一行都是一个由单词和短句组成的关键词,例如
Dog
Feeding cat
used cars in Brighton
trips to London
.....
这些数据需要与另一组文件进行比较(这个文件大小为7GB,我将称之为#39;删除'),删除中的任何关键字都需要识别并从正文中删除。删除的数据类似于身体中的数据,即:
Guns
pricless ming vases
trips to London
pasta recipes
........
虽然我有一种方法可以完成工作,但这是一种非常缓慢的方法,可能需要一周时间才能完成。这是一种多线程方法,其中来自7GB主体的每个文件在for循环中与来自正文的文件进行比较。它将删除文件中的列作为列表进行转换,然后过滤正文文件以保留不在该列表中的任何行。然后将过滤后的数据附加到输出文件:
def thread_worker(file_):
removal_path="removal_files"
allFiles_removals = glob.glob(removal_path + "/*.csv", recursive=True)
print(allFiles_removals)
print(file_)
file_df = pd.read_csv(file_)
file_df.columns = ['Keyword']
for removal_file_ in allFiles_removals:
print(removal_file_)
vertical_df = pd.read_csv(vertical_file_, header=None)
vertical_df.columns = ['Keyword']
vertical_keyword_list = vertical_df['Keyword'].values.tolist()
file_df = file_df[~file_df['Keyword'].isin(vertical_keyword_list)]
file_df.to_csv('output.csv',index=False, header=False, mode='a')
显然,我的主要目标是找出如何更快地完成这项工作。熊猫甚至是最好的方法吗?在处理CSV文件时,我倾向于默认使用它。
答案 0 :(得分:0)
IIUC你可以这样做:
# read up "removal" keywords from all CSV files, get rid of duplicates
removals = pd.concat([pd.read_csv(f, sep='~', header=None, names=['Keyword']) for f in removal_files]
ignore_index=True).drop_duplicates()
df = pd.DataFrame()
for f in body_files:
# collect all filtered "body" data (file-by-file)
df = pd.concat([df,
pd.read_csv(f, sep='~', header=None, names=['Keyword']) \
.query('Keyword not in @removals.Keyword')],
ignore_index=True)
答案 1 :(得分:0)
您可以将它们分成小块阅读,并将文本列作为类别以在阅读时删除重复项
从 pandas.api.types 导入 CategoricalDtype
TextFileReader = pd.read_csv(path, chunksize=1000, dtype = {"text_column":CategoricalDtype}) # 每块的行数
dfList = [] 对于 TextFileReader 中的 df: dfList.append(df)
df = pd.concat(dfList,sort=False)