我有大約 200 個 CSV 檔案,我需要將它們組合到特定的列上。每個 CSV 檔案在特定列上包含 1000 個填充行。我的檔案名如下:
csv_files = [en_tr_translated0.csv,en_tr_translated1000.csv,en_tr_translated2000.csv,……,en_tr_translated200000.csv]
我的 csv 檔案列如下所示:

在所有 csv 檔案中,前兩列被預填充到相同的 200.000 行/句子。我的每個en_tr_translated{ }.csv檔案都包含 1000 個與其檔案名相關的翻譯句子。例如:
en_tr_translated1000.csv檔案包含第 0 到第 1000 行的en_tr_translated2000.csv翻譯句子,檔案包含第 1000 到第 2000 行的翻譯句子等。其余為 nan/empty。en_tr_translated3000.csv下面是來自檔案的示例影像。

我想復制/合并/加入行以擁有一個包含所有翻譯句子的完整 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 個不同的資料集執行此操作,這變得非常煩人。
任何建議表示贊賞。
uj5u.com熱心網友回復:
您的輸入檔案的一行資料與檔案中的一行完全相同,對嗎?因此,如果您甚至不使用熊貓,它可能會更快。盡管如果正確完成,無論是否使用 pandas,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
uj5u.com熱心網友回復:
我將加載所有檔案,洗掉未完全填充的行,然后連接所有資料幀。
就像是:
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/486678.html
