Используйте skiprows
и header=None
, чтобы пропустить заголовок, names
, чтобы указать свой собственный список имен столбцов, и concat
, чтобы объединить в один df.т.е.
import pandas as pd
pd.concat([
pd.read_csv('file1.csv',skiprows=1,header=None,names=['a','b','c']),
pd.read_csv('file2.csv',skiprows=1,header=None,names=['a','b','c'])]
)
Редактировать: если разные файлы отличаются только порядком столбцов, вы можете указать разные порядки столбцов для names
, а если вы хотите выбрать подмножество столбцов, используйте usecols
.Но вам нужно сделать это сопоставление заранее, либо проверяя файл, либо какое-то другое правило.
Для этого необходимо как-то сопоставить файлы с обработчиками
т.е.
file1.csv
id, name, total_amount
1, "test", 123
file2.csv
member_id, tot_amnt, ignore, name
2, 1234, -1, "test2"
Следующее выбирает общие 3 столбца и переименовывает / переупорядочивает.
import pandas as pd
pd.concat([
pd.read_csv('file1.csv',skiprows=1,header=None,names=['id','name','value'],usecols=[0,1,2]),
pd.read_csv('file2.csv',skiprows=1,header=None,names=['id','value','name'],usecols=[0,1,3])],
sort=False
)
Редактировать 2:
И хороший способ применить это - использовать лямбду и карты - т.е.
parsers = {
"schema1": lambda f: pd.read_csv(f,skiprows=1,header=None,names=['id','name','value'],usecols=[0,1,2]),
"schema2": lambda f: pd.read_csv(f,skiprows=1,header=None,names=['id','value','name'],usecols=[0,1,3])
}
map = {
"file2.csv": "schema2",
"file1.csv": "schema1"}
pd.concat([parsers[v](k) for k,v in map.items()], sort=False)