Pandas DataFrame - итерация - PullRequest
       6

Pandas DataFrame - итерация

1 голос
/ 31 марта 2020

Прежде всего - я знаю, что итерация по Pandas DataFrame не очень хорошая идея, поэтому любые предложения относительно других возможных решений приветствуются.

Я пытаюсь написать небольшой кусочек кода для сравнить два кадра данных, один из которых представляет собой шаблон для сравнения.

Данные кадры выглядят так (конечно, сокращенная версия):

Шаблон:

            Template1 | Template2 | Template3 
----------------------+-----------+------------
Variable 1 |  value   |   value   |   value     
Variable 2 |  value   |   value   |   value     
Variable 3 |  value   |   value   |   value     
Variable 4 |  value   |   value   |   value   

И файл для сравнения (файл данных):

            Record 1 | Record 2 | Record 3 | Record 4
---------------------+----------+----------+----------
Variable 3 |  value  |  value   |  value   |  value  
Variable 1 |  value  |  value   |  value   |  value  
Variable 4 |  value  |  value   |  value   |  value

Теперь, что скрипт должен сделать:

  • взять один, указанный c столбец из файла шаблона
  • сравнить каждую запись в файле данных с выбранным столбцом

Мне удалось написать небольшой фрагмент кода, и он даже работает для одной записи:

template = templatefile['Template2']
record_to_check = datafile[0]

errors_found = []
for a in template.index:
    if a in record_to_check.index:
        variable = {}
        if template[a] == record_to_check[a]:
            # equal
            pass
        else:
            # unequal
            variable['name'] = a
            variable['value'] = template[a]
            errors_found.append(variable)
    else:
        # not found
        variable = {}
        variable['name'] = a
        variable['value'] = template[a]
        errors_found.append(variable)

Возвращает словарь ошибок_налички, содержащие пару {переменная: значение}. Проблема начинается, когда я пытаюсь поместить ее в другой файл l oop (для перебора записей в файле данных:

template = templatefile['Template2']

for record_to_check in datafile.iteritems():
    errors_found = []
    for a in template.index:
        if a in record_to_check.index:
            variable = {}
            if template[a] == record_to_check[a]:
                # equal
                pass
            else:
                # unequal
                variable['name'] = a
                variable['value'] = template[a]
                errors_found.append(variable)
        else:
            # not found
            variable = {}
            variable['name'] = a
            variable['value'] = template[a]
            errors_found.append(variable)

результат:

Traceback (most recent call last):
  File "attributes.py", line 24, in <module>
    if a in record_to_check.index:
TypeError: argument of type 'builtin_function_or_method' is not iterable

Что я делаю неправильно?

РЕДАКТИРОВАТЬ: ожидаемый результат должен быть словарь, как это:

[{'name': 'variable2', 'value': value_from_template}, {'name': 'variable3', 'value': value_from_template}]

И я знаю, что если я запустил его в l oop, он будет перезаписывать словарь для каждой итерации. Я просто Я хотел быть уверен, что он работает с несколькими записями, поэтому я могу сделать из него функцию.

1 Ответ

0 голосов
/ 31 марта 2020

Как вы сами указали, циклический перебор pandas данных не является хорошим подходом. Вместо этого вы должны использовать объединение, вот несколько идей:

Предполагается, что у вас есть справочная таблица

template
        template1   template2
index                        
var 1           1           5
var 2           2           4
var 3           3           3
var 4           4           2

и таблица данных

datafile
        record1   record2
index                    
var 3         1         3
var 1         2         3
var 4         4         2
  • A Левое объединение индексов автоматически сопоставляет переменные, порядок не играет роли: joined = template.join(datafile, how='left').
  • Затем вы можете легко создавать новые столбцы, которые сообщают вам, соответствуют ли значения в шаблоне и таблице данных: joined['temp1=rec1'] = joined["template1"] == joined["record1"].
  • Этот столбец можно использовать для отображения только тех строк, значения которых не совпадают: errors_found = joined[~joined['temp1=rec1']]
errors_found
        template1   template2   record1   record2  temp1=rec1
index                                                        
var 1           1           5       2.0       3.0       False
var 2           2           4       NaN       NaN       False
var 3           3           3       1.0       3.0       False
  • Теперь вы можете получить словарь со значениями шаблона: errors_found = joined[~joined['temp1=rec1']]['template 1'].to_dict()
{'var 1': 1, 'var 2': 2, 'var 3': 3}

Если вы хотите это для более чем одной пары столбцов, вы можете поместить этот код в функцию и l oop / отобразить поверх столбцы.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...