У меня есть два примера файлов CSV, которые выглядят следующим образом:
t1.txt
ID Date Col1 Col2
AAA 11/08/1995 6.87 1
AAF 11/09/1995 3.56 0
BBW 10/09/2002 4.56 1
CD 11/08/1995 4.56 0
t2.txt
ID Date Col1 Col3
AAA 11/09/1995 2.34 234
AAF 11/09/1995 3.56 156
BBW 10/09/2002 4.56 289
CCF 03/18/1995 1.23 423
Я пытаюсь объединить файлы CSV как внешнее объединение в столбцах ID
и Date
.Я не использую Pandas, такие как df1.merge(df2, how = 'outer', on = ['ID', 'Date'])
или sqlite3, потому что эти файлы больше, чем образцы, которые я показал, и у Pandas не хватает памяти.До сих пор моя попытка была
import csv
from collections import defaultdict
columns = []
for file in ['t1.txt', 't2.txt']:
with open(file, 'r') as f:
csvreader = csv.reader(f, delimiter = '\t')
headers = next(csvreader)
for h in headers:
if h not in columns:
columns.append(h)
data = {}
for file in ['t1.txt', 't2.txt']:
with open(file, 'r') as fin:
reader = csv.DictReader(fin, delimiter = '\t')
for row in reader:
key = (row['ID'], row['Date'])
if key not in data.keys():
data[key] = defaultdict(list)
for col in columns:
if col not in ['ID', 'Date']:
value = row.get(col, '')
data[key][col].append(value)
else:
for col in columns:
if col not in ['ID', 'Date']:
value = row.get(col, '')
data[key][col].append(value)
, которая производит словарь, который выглядит как
{('AAA', '11/08/1995'): defaultdict(list, {'Col1': ['6.78'], 'Col2': ['1'], 'Col3': ['']}),
('AAA', '11/09/1995'): defaultdict(list, {'Col1': ['2.34'], 'Col2': [''], 'Col3': ['234']}),
('AAF', '11/09/1995'): defaultdict(list, {'Col1': ['3.56'], 'Col2': ['0', ''], 'Col3': ['', '156']}),
('BBW', '10/09/2002'): defaultdict(list, {'Col1': ['4.56', '4.56'], 'Col2': ['1', ''], 'Col3': ['', '289']}),
('CCF', '03/18/1995'): defaultdict(list, {'Col1': ['1.23'], 'Col2': [''], 'Col3': ['423']}),
('CD', '11/08/1995'): defaultdict(list, {'Col1': ['4.56'], 'Col2': ['0'], 'Col3': ['']})}
Это близко, но я ожидаю, что полученный словарь будет выглядеть как
{('AAA', '11/08/1995'): defaultdict(list, {'Col1': ['6.78'], 'Col2': ['1'], 'Col3': ['']}),
('AAA', '11/09/1995'): defaultdict(list, {'Col1': ['2.34'], 'Col2': [''], 'Col3': ['234']}),
('AAF', '11/09/1995'): defaultdict(list, {'Col1': ['3.56'], 'Col2': ['0'], 'Col3': ['156']}),
('BBW', '10/09/2002'): defaultdict(list, {'Col1': ['4.56'], 'Col2': ['1'], 'Col3': ['289']}),
('CCF', '03/18/1995'): defaultdict(list, {'Col1': ['1.23'], 'Col2': [''], 'Col3': ['423']}),
('CD', '11/08/1995'): defaultdict(list, {'Col1': ['4.56'], 'Col2': ['0'], 'Col3': ['']})}
где столбцы с пустыми строками заменяются значением (если оно существует).Это словарь словаря списков, где первичный ключ - это пара ID
и Date
, ключи во вложенном словаре - это имена столбцов, а каждый элемент в списке значений в столбце - свойстрока.Я часами пытался понять, как это сделать, но я продолжаю получать дубликаты.Как я могу объединить файлы, как это?