代码之家  ›  专栏  ›  技术社区  ›  Bilal Sedef

如何快速组合特定列上的多个csv文件?

  •  0
  • Bilal Sedef  · 技术社区  · 2 年前

    我有大约200个CSV文件,我需要将它们合并到特定的列中。每个CSV文件在特定列上包含1000个填充行。我的文件名如下:

    csv\u文件=[en\u tr\u translated0.csv,en\u tr\u translated1000.csv,en\u tr\u translated2000.csv,…,en\u tr\u translated200000.csv]

    我的csv文件列如下所示:

    enter image description here

    在所有csv文件中,前两列预填充到相同的200.000行/句子。我的每个 en_tr_translated{ }.csv 文件包含1000个与其文件名相关的翻译句子。例如: en_tr_translated1000.csv 文件包含从第0行到第1000行的翻译句子, en_tr_translated2000.csv 文件包含从第1000行到第2000行等的翻译句子。其余为nan/空。下面是来自 en_tr_translated3000.csv 文件

    enter image description here

    我想复制/合并/连接这些行,以获得一个包含所有翻译句子的完整csv文件。我尝试了以下代码:

    out = pd.read_csv(path + 'en_tr_translated0.csv', sep='\t', names=['en_sentence', 'tr_sentence', 'translated_tr_sentence', 'translated_en_sentence'], dtype=str, encoding='utf-8', low_memory=False)
    ##
    i = 1000
    
    for _ in tqdm(range(200000)):
        new = pd.read_csv(path + f'en_tr_translated{i}.csv', sep='\t', names=['en_sentence', 'tr_sentence', 'translated_tr_sentence', 'translated_en_sentence'], dtype=str, encoding='utf-8', low_memory=False)
        out.loc[_, 'translated_tr_sentence'] = new.loc[_, 'translated_tr_sentence']
        out.loc[_, 'translated_en_sentence'] = new.loc[_, 'translated_en_sentence']
        if _ == i:
            i += 1000
    

    实际上,它工作得很好,但我的问题是,它需要105个小时!!

    有没有更快的方法?我必须为5个不同的数据集这样做,这让人非常恼火。

    欢迎提出任何建议。

    2 回复  |  直到 2 年前
        1
  •  1
  •   ewz93    2 年前

    输入文件中的一行数据与文件中的一行数据完全相同,对吗?所以,如果你不使用熊猫,速度可能会更快。尽管如果做得正确,无论是否使用熊猫,200.000应该仍然非常快。

    如果不这样做:只需打开每个文件,移动到拟合索引,在输出文件中写入1000行即可。然后转到下一个文件。您可能需要修复标题等,并注意索引没有变化,但下面是一个如何做到这一点的想法:

    with open(path + 'en_tr_translated_combined.csv', 'w') as f_out: # open out file in write modus
        for filename_index in tqdm(range(0, 201000, 1000)): # iterate over each index in steps of 1000 between 0 and 200000
            with open(path + f'en_tr_translated{filename_index}.csv') as f_in: # open file with that index
                for row_index, line in enumerate(f_in): # iterate over its rows
                    if row_index < filename_index: # skip rows until you reached the ones with content in translation
                        continue
                    if row_index > filename_index + 1000: # close the file if you reached the part where the translations end
                        break
                    f_out.write(line) # for the inbetween: copy the content to out file
    
        2
  •  0
  •   Zaero Divide    2 年前

    我将加载所有文件,删除未完全填充的行,然后连接所有数据帧。

    类似于:

    dfs = []
    for ff in Path('.').rglob('*.csv'):
        dfs.append((pd.read_csv(ff, names=['en_sentence', 'tr_sentence', 'translated_tr_sentence', 'translated_en_sentence'], dtype=str, encoding='utf-8', low_memory=True).dropna())
    df = pd.concat(dfs)