Извлеките определенные значения из профилирования панд в таблицу

#python #pandas #profiling #pandas-profiling

Вопрос:

Я использую профилирование pandas для создания HTML — отчетов о некоторых кадрах данных с более чем 150 атрибутами. Я хотел бы извлечь некоторую информацию и расположить ее в простой таблице. В частности, мне нужно количество отсутствующих данных в каждой переменной «n_missing», отдельные значения и соответствующие им проценты «p_missing».

Кое-что я сделал, но я изо всех сил пытаюсь это сделать:

 df1 = pd.read_excel('df.xlsx') profile = df1.profile_report(title="Dataset Profiling Report") profile.to_file('dataset_report.html') #HTML report   profset = profile.description_set #Extracting the info from the profile object print(profset.keys())  OUT[]: dict_keys(['analysis', 'table', 'variables', 'scatter', 'correlations', 'missing', 'messages', 'package', 'sample', 'duplicates'])  attributes = profset["variables"] print(attributes.keys()) OUT: dict_keys(['Attribute 1', 'Attribute 2', 'Attribute 3', 'Attribute 4'...]) #All my columns or attributes.  

Я думал, что «отсутствующий» ключ профиля.ключи description_set были бы единственными, но я понимаю это:

 missing = profset["missing"] print(missing.keys()) dict_keys(['bar', 'matrix', 'heatmap', 'dendrogram'])  

И ни один из них, похоже, не является правильным.

Я просматривал документацию по профилированию панд и искал в Интернете и нашел только один возможный пример, который привел меня к предыдущему написанному мной коду.

Конечная цель-таблица для экспорта в excel, которая выглядит следующим образом (игнорируйте фактические значения).:

 Attributes n_Missing p_missing n_disctinct p_disctinct Attribute X 23 0.23 2 0.5 Attribute Y 50 0.50 50 1.0 Attribute Z 0 0.00 100 1.0 ...  

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

1. Пожалуйста, опубликуйте минимальный воспроизводимый пример. В частности, напишите какой-нибудь код, например df1 = pd.DataFrame(some_list) , чтобы мы могли видеть, что внутри df1 . В противном случае мы не сможем вам помочь.

Ответ №1:

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

Это само собой разумеется, дайте мне знать, если у вас есть какие-либо сомнения.

Показан полный код с фиктивным фреймом данных для полного воспроизведения.

Создайте фрейм данных с некоторыми данными в нем

 dfa = pd.DataFrame(np.random.rand(20,3), columns=['attribute X', 'attribute Y', 'attribute Z']) dfa.loc[dfa['attribute X']lt;0.5,'attribute X'] = np.nan dfa.loc[dfa['attribute X']lt;0.75,'attribute X'] = 0.6 dfa.loc[dfa['attribute X']gt;0.75,'attribute X'] = "value X" dfa   Out[346]:   attribute X attribute Y attribute Z 0 NaN 0.929178 0.439837 1 NaN 0.620489 0.146956 2 0.6 0.971534 0.048539 3 value X 0.113160 0.344989 4 value X 0.766421 0.105712 5 value X 0.706522 0.800705 6 value X 0.451648 0.763452 7 NaN 0.110620 0.976297 8 NaN 0.032442 0.650167 9 0.6 0.532029 0.028842 10 0.6 0.316751 0.010858 11 value X 0.096364 0.381514 12 0.6 0.897551 0.426949 13 value X 0.178309 0.974560 14 NaN 0.461955 0.573013 15 value X 0.446666 0.919223 16 0.6 0.526870 0.751822 17 value X 0.709627 0.334106 18 0.6 0.780467 0.940426 19 value X 0.056930 0.846433   

Создайте отчет профиля и отчет в формате html

 profile_a = dfa.profile_report() profile_a.to_file('dfa.html')  

Доступ к ключам данных, содержащихся в отчете

 profset = profile_a.description_set print(profset.keys())  

Доступ к данным атрибутов/переменных/столбцов, проанализированным в отчете

 attributes = profset["variables"] print(attributes.keys())  

Создайте список проанализированных атрибутов для повторения

 attributes_keys = attributes.keys()  

Мы можем ознакомиться с доступными данными для каждого атрибута, получив доступ к ключам атрибута, а затем выбрать все, что мы хотим

 attributes['attribute X'].keys()  Out[]: dict_keys(['n_distinct', 'p_distinct', 'is_unique', 'n_unique', 'p_unique', 'type', 'hashable', 'value_counts_without_nan', 'n_missing', 'n', 'p_missing', 'count', 'memory_size'])    

Чтобы составить таблицу из данных, которые я решил извлечь. Я выбрал все необходимое из предыдущего списка, затем повторил. Следующий цикл for неэффективен, но очень понятен для всех.

 list_attribute = [] list_missing = [] list_p_missing = [] #'p_missing' list_disctinct = [] #'n_distinct' list_p_disctinct = [] #'p_distinct'   for i in attributes_keys:  list_attribute.append(i)  x = attributes[i]  list_missing.append(x['n_missing'])  list_p_missing.append(x['p_missing'])   list_disctinct.append(x['n_distinct'])   list_p_disctinct.append(x['p_distinct'])      df_missing = pd.DataFrame(columns=('Attribute','Missing')) df_missing['Attribute'] = list_attribute df_missing['Missing'] = list_missing df_missing['Percentage Missing'] = list_p_missing df_missing['Disctinct values'] = list_disctinct df_missing['Percentage Disctinct'] = list_p_disctinct  df_missing['Percentage Disctinct'] = df_missing['Percentage Disctinct']*100 df_missing['Percentage Missing'] = df_missing['Percentage Missing']*100   

Готов

  print(df_missing)  Out[345]:   Attribute Missing ... Disctinct values Percentage Disctinct 0 attribute X 0 ... 2 13.333333 1 attribute Y 20 ... 20 100.000000 2 attribute Z 20 ... 20 100.000000