Способ расширить избыточные столбцы в таблице CSV? - PullRequest
0 голосов
/ 04 мая 2018

У меня есть CSV-файл с 13 столбцами, который я пытаюсь расширить определенным образом. Мои столбцы:

firstName, firstName2, lastName, lastName2, location1, location2, location3, location4, email, email2, phone, phone2, phone3

Данные не идеально чисты (как можно себе представить, когда речь идет об именах людей), и я хочу расширить данные для каждой записи в большое количество возможных комбинаций данных. Не все возможные комбинации данных, но близки к ним. Не каждая запись содержит все данные (на самом деле я не думаю, что какая-либо строка содержит данные для каждого столбца).

Является ли лучший способ сделать это действительно вложенной многоотраслевой структурой? По сути, сейчас я начинаю с col1 и проверяю значение, затем проверяю col2, добавляю каждую комбинацию в список словарей и затем добавляю эти значения в основной список словарей.

Например, в словаре1

  • firstName, lastName, location1, электронная почта, телефон
  • firstName, фамилия, location1, электронная почта, телефон2
  • ...
  • firstName, lastName, location2, электронная почта, телефон
  • ...
  • firstNamefirstName2 (вместе), фамилия, местоположение, адрес электронной почты, телефон

Каждый ряд станет как 36 рядов (честно говоря, не знаю, никогда не был очень хорош в комбинаторной математике, особенно с условными выражениями).

Есть ли что-нибудь, что я могу использовать, чтобы сделать это более простым? Библиотека или что-то?

Обновление: Фактический комбинаторный алгоритм таков:

fn      ln      loc email phones
fn      lnln2   loc email phones
fn      ln2     loc email phones
fnfn2   ln      loc email phones
fnfn2   lnln2   loc email phones
fnfn2   ln2     loc email phones
fn2     ln      loc email phones
fn2     lnln2   loc email phones
fn2     ln2     loc email phones

, где расширяется 4 местоположения, 2 электронных письма и 3 телефона.

И я не хочу избыточности пустых значений. Я полагаю, что было бы легче просто удалить дубликаты после создания файла CSV (это просто в Excel).

1 Ответ

0 голосов
/ 05 мая 2018

Решением было просто создать 3-вложенный цикл for и выполнить девять операторов создания словаря. Это привело к появлению 216 записей для каждой строки, что означало, что я мог устранить дубликаты с помощью простого сценария, который я скопировал из stackoverflow ( Удаление дублирующихся строк из файла CSV с помощью сценария Python )

Были еще увольнения. Например, когда к имени name2 не добавлялось пустое имя first2, добавлялся пробел, и мой искатель дубликатов распознавал firstname и firstname + '' как отдельные значения и сохранял дубликаты. Я не против, однако, это не имеет значения для моих целей. Я просто не хотел, чтобы избыточность составляла 216 значений для каждого.

final = [{}]

for agent in agents:

   #create a list of dictionaries for this agent
   finalagents = [{}]
   for i in range(1,4):
    for j in range(1,3):
        for k in range(1,2):
            city = 'city' + str(i)
            state = 'state' + str(i)
            zipcode = 'zip' + str(i)
            phone = 'phone' + str(j)
            email = 'email' + str(k)
            fnfn1 = agent['fn'] + ' ' + agent['fn1']
            lnln1 = agent['ln'] + ' ' + agent['ln1']

            #fn ln
            finalagents.append({'fn': agent['fn'], 'ln': agent['ln'], 'city': agent[city], 'state': agent[state],
                'zip': agent[zipcode], 'phone': agent[phone], 'email': agent[email]}) 
            #fn lnln1 
            finalagents.append({'fn': agent['fn'], 'ln': lnln1, 'city': agent[city], 'state': agent[state],
                'zip': agent[zipcode], 'phone': agent[phone], 'email': agent[email]}) 
            #fn ln1
            finalagents.append({'fn': agent['fn'], 'ln': agent['ln1'], 'city': agent[city], 'state': agent[state],
                'zip': agent[zipcode], 'phone': agent[phone], 'email': agent[email]}) 
            #fnfn1 ln 
            finalagents.append({'fn': fnfn1, 'ln': agent['ln'], 'city': agent[city], 'state': agent[state],
                'zip': agent[zipcode], 'phone': agent[phone], 'email': agent[email]}) 
            #fnfn1 lnln1
            finalagents.append({'fn': fnfn1, 'ln': lnln1, 'city': agent[city], 'state': agent[state],
                'zip': agent[zipcode], 'phone': agent[phone], 'email': agent[email]}) 
            #fnfn1 ln1
            finalagents.append({'fn': fnfn1, 'ln': agent['ln1'], 'city': agent[city], 'state': agent[state],
                'zip': agent[zipcode], 'phone': agent[phone], 'email': agent[email]}) 
            #fn1 ln
            finalagents.append({'fn': agent['fn1'], 'ln': agent['ln'], 'city': agent[city], 'state': agent[state],
                'zip': agent[zipcode], 'phone': agent[phone], 'email': agent[email]}) 
            #fn1 lnln1
            finalagents.append({'fn': agent['fn1'], 'ln': lnln1, 'city': agent[city], 'state': agent[state],
                'zip': agent[zipcode], 'phone': agent[phone], 'email': agent[email]}) 
            #fn1 ln1
            finalagents.append({'fn': agent['fn1'], 'ln': agent['ln1'], 'city': agent[city], 'state': agent[state],
                'zip': agent[zipcode], 'phone': agent[phone], 'email': agent[email]}) 

#add the finalagents list of dictionaries to the official final list of dictionaries in an iterable for loop
for dictionary in finalagents:
    final.append(dictionary)
...