#java #python #bash #csv #optimization
#java #python #bash #csv #оптимизация
Вопрос:
Я видел много других вопросов по этому поводу, но моя ситуация немного отличается.
Я пытаюсь создать / найти программу, которая будет объединять файлы csv следующим образом.
file1.csv
colHeadders 1col1head 1col2head 1col3head ...
row1head 1data[1][1] 1data[1][2] 1data[1][3] ...
row2head 1data[2][1] 1data[2][2] 1data[2][3] ...
headNotShared 1data[3][1] 1data[3][2] 1data[3][3] ...
row4head 1data[4][1] 1data[4][2] 1data[4][3] ...
...
file2.csv
colHeadders 2col1head 2col2head 2col3head ...
row1head 2data[1][1] 2data[1][2] 2data[1][3] ...
row2head 2data[2][1] 2data[2][2] 2data[2][3] ...
row4head 2data[3][1] 2data[3][2] 2data[3][3] ...
headNotShared 2data[4][1] 2data[4][2] 2data[4][3] ...
...
merged.csv
colHeaders 1col1head 1col2head 1col3head ... 2col1head 2col2head 2col3head ...
row1head 1data[1][1] 1data[1][2] 1data[1][3] ... 2data[1][1] 2data[1][2] 2data[1][3]
row2head 1data[2][1] 1data[2][2] 1data[2][3] ... 2data[2][1] 2data[2][2] 3data[3][2]
row4head 1data[4][1] 1data[4][2] 1data[4][3] ... 2data[3][1] 2data[3][2] 2data[3][3] ...
...
Дополнительная сложность заключается в том, что файлы могут не использовать все заголовки, и в этом случае я хочу, чтобы объединенный csv содержал только строки с общими заголовками. Если это поможет, точные файлы, с которыми я работаю, — это большие prfiles methalation, и я пытаюсь предварительно обработать данные. На самом деле файл будет выглядеть следующим образом:
------ 03--34 08--45 08--59 ...
cg000000957 0.8950 0.8876 0.8953 ...
cg000001349 0.7687 0.7687 0.7700 ...
...
------ 03--34 08--45 08--59 ...
cg000000957 0.8951 0.8877 0.8954 ...
cg000001101 0.6013 0.6100 0.6022 ...
...
Что-то, что может помочь, это знать, что заголовки строк расположены в порядке возрастания. Это большие файлы, превышающие гигабайт, поэтому скорость жизненно важна. Язык на самом деле не имеет значения, и я попытался написать скрипт bash для этого, но безрезультатно. Файлы csv представлены в формате txt, разделенные символом space tab.
Ответ №1:
Я запускаю этот код на python 3.7, и он делает то, что вы хотите.
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
result = pd.concat([df1, df2], axis=1, sort=False)
print(result.dropna())
вывод:
A B C D B D F
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
Ответ №2:
Другой подход (хотя Python 3.x):
# Read both file into pandas dataframe
df1 = pd.read_csv("file1.csv", sep="t").set_index("colHeadders")
df2 = pd.read_csv("file2.csv", sep="t").set_index("colHeadders")
# Join them with an inner join (only index contained in both dataframes are kept)
new_df = df1.join(df2, how="inner", lsuffix="_df1", rsuffix="_df2")
Вывод:
1col1head_df1 1col2head_df1 1col3head_df1 2col1head_df2 ...
colHeadders
row1head 1data[1][1] 1data[1][2] 1data[1][3] 2data[1][1] ...
row2head 1data[2][1] 1data[2][2] 1data[2][3] 2data[2][1] ...
row4head 1data[4][1] 1data[4][2] 1data[4][3] 2data[3][1] ...