Присоединение файлов CSV к столбцу с использованием словарей, таких как SQL Outer Join - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть два примера файлов 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, ключи во вложенном словаре - это имена столбцов, а каждый элемент в списке значений в столбце - свойстрока.Я часами пытался понять, как это сделать, но я продолжаю получать дубликаты.Как я могу объединить файлы, как это?

...