#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 и т.д.