Очистка набора данных, где каждая запись обрабатывается как таблица

#python #pandas #datatables #data-cleaning

#python #pandas #таблицы данных #очистка данных

Вопрос:

У меня есть набор данных, содержащий около 800 тыс. строк. Должно быть только около 6 тыс. отдельных записей с несколькими столбцами данных. Проблема в том, что каждая запись обрабатывается как таблица. Например:

 header            data

id                     238
name           machine_one
serial             1234556
purchase_date   11/19/2010
status                good
id                     239
name           machine_two
serial             3456789
purchase_date   11/19/2020
status                 bad
id                     240
name           machine_six
serial             1122334
purchase_date   11/19/2019
status                fair
 

ПРИМЕЧАНИЕ: каждая запись содержит разное количество точек данных. Я использую пять в качестве примера, но у некоторых их 30, у некоторых 12 и так далее. Перед каждой новой записью есть строка «NEWRECORD ****», которая обозначает новую запись.

Я немного его почистил, все это была одна строка без структуры. Будет ли перекрестная таблица тем, что я ищу? Любые указатели / подсказки с благодарностью.

Комментарии:

1. В каком формате эти данные? Это список списков? ndarray? Фрейм данных?

2. @thehumaneraser это фрейм данных

Ответ №1:

приведенные выше данные:

 import pandas as pd

data=[{'header': 'id', 'data': '238'},
 {'header': 'name', 'data': 'machine_one'},
 {'header': 'serial', 'data': '1234556'},
 {'header': 'purchase_date', 'data': '11/19/2010'},
 {'header': 'status', 'data': 'good'},
 {'header': 'id', 'data': '239'},
 {'header': 'name', 'data': 'machine_two'},
 {'header': 'serial', 'data': '3456789'},
 {'header': 'purchase_date', 'data': '11/19/2020'},
 {'header': 'status', 'data': 'bad'},
 {'header': 'id', 'data': '240'},
 {'header': 'name', 'data': 'machine_six'},
 {'header': 'serial', 'data': '1122334'},
 {'header': 'purchase_date', 'data': '11/19/2019'},
 {'header': 'status', 'data': 'fair'}]

df = pd.DataFrame(data)

 

можете ли вы предположить, что каждая запись состоит из 5 строк? если да, то вы можете сделать это:

 ## create record index column
record = pd.DataFrame(pd.Series(range(len(df)//5)).repeat(5)).reset_index(drop=True)

## concatenate it horizontally to your file:
df = pd.concat([df, record], axis=1).rename(columns={0:'record'})

### pivot the result and cleanup index headings:
df = df.pivot(columns='header', index='record').copy().reset_index(drop=True)
df.columns = df.columns.get_level_values(1)
df.columns.name = None

print(df)
 

ВЫВОД:

     id  name    purchase_date   serial  status
0   238 machine_one 11/19/2010  1234556 good
1   239 machine_two 11/19/2020  3456789 bad
2   240 machine_six 11/19/2019  1122334 fair
 

Комментарии:

1. Все они имеют разное количество строк, но при каждом запуске новой записи появляется строка с именем NEWRECORD **** . Поэтому мне пришлось бы перезапустить индекс там. Будут ли те же шаги за вычетом len ? Нужно ли мне экранировать * ?

2. Я не уверен, что вы имеете в виду. если ваши данные отличаются от тех, которыми вы поделились в вопросе, вы должны указать это. логика здесь предполагает, что ваши данные поступают с 5 строками на одну запись, поэтому она преобразует 5 строк в одну запись.

3. Я должен был быть более конкретным, я отредактировал свой вопрос. Каждая запись имеет разное количество точек данных — у некоторых их 5, у других 12 и т.д.