Построение недостающих значений по категориям в виде доли от общих значений в каждой категории в matplotlib - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть 2 столбца в наборе данных, один - Страна, другой - Пол, Пол имеет некоторые значения NaN или N / A. В pandas это выглядит так:

import pandas as pd    
Country = ['United Kingdom', 'Bosnia and Herzegovina', 'Thailand', 'United States', 'Ukraine', 'Canada', 'Ukraine', 'India', 'New Zealand', 'India', 'Antigua and Barbuda', 'Canada', 'United States', 'Germany', 'India', 'United Kingdom', 'Australia', 'Russian Federation', 'Brazil', 'Lithuania']
Gender = ['Man', 'Man', 'Man', 'Man', 'Man', 'Man', 'Man', 'Man', 'Man', nan, 'Man', 'Woman', 'Man', 'Man', 'Man', 'Man', 'Man', 'Man', 'Man', 'Man']

Я хочу отобразить пропущенные значения как пропорцию всех значений Gender в категории Country. Сначала я использую groupby в столбце «Страна», который дает мне только общее количество полов в стране. Какой будет лучший способ отобразить пропущенные значения в виде доли от общего значения пола в стране:

РЕДАКТИРОВАТЬ: ответил на этот вопрос в комментариях просмотрите решение, если вы считаете, что решение могло бы быть лучше, пожалуйста, прокомментируйте под комментарием к решению.

1 Ответ

0 голосов
/ 01 мая 2020

Привет, вот я создал решение для него,

  • Сначала я создал аналогичный фрейм данных, который имеет все значения в Gender = NaN,
  • , затем я заменил NaN на 1s
  • Я сгруппировал этот фрейм данных по Стране и суммировал количество столбцов Пола
  • , затем в исходном фрейме данных я снова заполнил NaN 1с (это можно сделать на первом шаге)
  • , затем сгруппировал этот фрейм данных по стране и суммировал столбец «Пол»
  • Я соединил эти 2 фрейма данных по оси 1
  • Я создал столбец, который принимает фрейм данных 1 Количество полов (количество гендерных = NaN на страну), множители на 100 и делится на второй фрейм данных Число полов
  • Затем я построил этот новый столбец как гистограмму

enter image description here

    Country = ['United Kingdom', 'Bosnia and Herzegovina', 'Thailand', 'United States', 'Ukraine', 'Canada', 'Ukraine', 'India', 'New Zealand', 'India', 'Antigua and Barbuda', 'Canada', 'United States', 'Germany', 'India', 'United Kingdom', 'Australia', 'Russian Federation', 'Brazil', 'Lithuania']
    Gender = ['Man', 'Man', 'Man', 'Man', 'Man', 'Man', 'Man', 'Man', 'Man', nan, 'Man', 'Woman', 'Man', 'Man', 'Man', 'Man', 'Man', 'Man', 'Man', 'Man']
    survey = pd.DataFrame({ 'Country' :Country , 'Gender':Gender})
    null_gender["Gender"].fillna(1, inplace = True) # filling 1 instead of NaN for the count in next line of code
    freq = null_gender.groupby('Country')['Gender'].count().rename('NullCount') # Number of NaN in Gender Column per country

    survey["Gender"].fillna(1, inplace = True)
    freq_full =survey.groupby('Country')['Gender'].count().rename('Totalcount')
    total_freq = pd.concat([freq, freq_full], axis=1)
    total_freq = total_freq.dropna(how='any',axis=0) 
    total_freq['null_percent'] = total_freq.apply(lambda row: round((row.NullCount*100) /row.Totalcount, 2) , axis = 1) 
    total_freq.sort_values('null_percent', ascending=True, inplace=True)
    total_freq['null_percent'].plot(kind='barh', figsize=(10,25))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...