У меня есть система, в которой вы вручную вводите данные, например данные о людях. Некоторые поля являются обязательными, но большинство опциональны. Когда данные выводятся, он не нормализует данные, а структурирует их так, что первая строка представляет собой заголовки полей, которые вы заполнили, а вторая строка — данные.
import pandas as pd
import numpy as np
import pandas as pd
import numpy as np
data = [
['Name', 'Age', 'Eye_Colour', 'Height', 'Hair Colour', 'Kids', 'Job', np.nan, np.nan, np.nan, np.nan],
['John', '30', 'Brown', '130', 'Brown', 2, 'IT', np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
['Name', 'Age', 'Eye_Colour', np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
['Alex', 33, 'Blue', np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
['Name', 'Surname', 'Eye_Colour', 'Middlename', 'Nationality', 'Age', 'Height', 'Hair Colour', 'Kids', 'Job', 'Salary'],
['Mary', 'Smith', 'Green', 'Rose', 'UK', '50', 130, 'Black', 'None', 'Sales', 120000],
['Name', 'Surname', 'Eye_Colour', 'Middlename', 'Nationality', 'Age','Salary', np.nan, np.nan, np.nan, np.nan],
['Sarah', 'Short', 'Green', 'Susie', 'Americann', 22, 25000, np.nan, np.nan, np.nan, np.nan]
]
joined_data = pd.DataFrame(data, columns = [1,2,3,4,5,6,7,8,9,10,11, 12, 13, 14])
Мне необходимо
Полностью нормализуйте данные. Таким образом, это будет означать, что 5-я строка или заголовки столбцов для Mary, будут заголовками столбцов для всего фрейма данных. И другие записи будут соответствовать правильным заголовкам.
разделить данные на фреймы данных на основе соответствующей переменной, в данном случае Eye_Colour. Здесь это выглядит так: 3 фрейма данных, по одному для Brown, Blueи Green. Каждый из них будет иметь разное количество заголовков столбцов. Кадр данных для Blueбудет иметь только 3 столбца. Eye_Colourявляется обязательным полем и всегда находится в одном и том же месте, т.е. всегда возвращается сjoined_data[3]
Я начал с 2), удалив последние 3 столбца через dropna(axis = 1, how = 'all'), где вообще нет данных ни для каких строк. Затем фильтруем, Eye_Colourа также берем строку выше
joined_data_mask = ((joined_data[3] == 'Green') | (joined_data[3].shift(-1) == 'Green') )
joined_data[joined_data_mask]
Который возвращает данные для Green. Следующей моей мыслью было вычислить длину строки без Nans (которая может быть разной для каждого человека). Затем я бы сгруппировал, сопоставив их, и разделил их на разные фреймы данных. Затем я бы взял df с наибольшим количеством заголовков столбцов, использовал его в качестве своего шаблона и добавил к нему все остальные.
Я думаю, что мог бы использовать это решение для решения проблемы 1), но я не уверен.
Данные, с которыми я имею дело, большие - около 300 столбцов и> 150000 строк. Существует также около 300 типов 'eye_color', поэтому эффективность достаточно важна. Любая помощь приветствуется.
Решение проблемы
Если подумать, что разделение кадров данных путем прохождения data2 на 2 является правильным подходом. Я немного не понимаю, что такое сопоставление переменных.
pd.concatобъединит кадры данных и выровняет столбцы. Вам нужно будет удалить значения nan при создании фреймов данных:
pd.concat([
pd.DataFrame(
[[x for x in data[i+1] if str(x)!='nan']],
columns = [x for x in data[i] if str(x)!='nan'])
for i in range(0, len(data), 2)])
.reset_index(drop=True)
Выход:
Name Age Eye_Colour Height Hair Colour Kids Job Surname Middlename Nationality Salary
0 John 30 Brown 130 Brown 2 IT NaN NaN NaN NaN
1 Alex 33 Blue NaN NaN NaN NaN NaN NaN NaN NaN
2 Mary 50 Green 130 Black None Sales Smith Rose UK 120000.0
3 Sarah 22 Green NaN NaN NaN NaN Short Susie Americann 25000.0
Комментариев нет:
Отправить комментарий