Как получить нормализованные значения подсчетов в Панд по каждой отдельной записи в другом столбце (точно так же, как на категориальной линейчатой диаграмме)

#python #pandas #dataframe #numpy #pandas-groupby

Вопрос:

У меня есть фрейм данных, который выглядит так:

 df = Pd.DataFrame({'Correct Prediction (Insert None if none of the predictions are correct)':[1,0,1,4,'NONE',1,0,3,2,'NONE'],  'Subject':['Physics','Maths','Chemistry','Biology','Physics','Physics','Maths','Biology','Chemistry','Maths']})  

Поэтому я хочу получить все записи, чтобы увидеть, сколько % каждого предмета в 0,1,2,3,4 и НИ ОДНОГО. Давайте предположим, что большая часть Физики ОТСУТСТВУЕТ, чтобы я мог получить общее количество Вопросов, которые ОТСУТСТВУЮТ И относятся к физике, а затем разделить на общее количество вопросов по физике. Я могу сделать это сложным способом, используя приведенный ниже код:

 df['Subject'].value_counts() df[(df['Subject'] == 'Physics') amp; (df['Correct Prediction (Insert None if none of the predictions are correct)'] == position)].shape[0]  

введите описание изображения здесь

Но каков самый простой и лучший способ сделать это?

Я пытался

 pd.crosstab(df['Correct Prediction (Insert None if none of the predictions are correct)'],df['Subject'], normalize = True)  

Но это дает мне странные значения, такие как 0,1 вместо 0,333

введите описание изображения здесь

Я могу сделать это в цикле, как:

 counts = df['Subject'].value_counts() for index in counts.index:  print(f"Results for: {index}n")  total_count = counts[index]  for position in [0,1,2,3,4,'NONE']:  i = df[(df['Subject'] == index) amp; (df['Correct Prediction (Insert None if none of the predictions are correct)'] == position)].shape[0]  print(f"Position {position} : {round((i / total_count)*100, 2)}%")  print("-"*50,'n')  

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

1. Пожалуйста, приведите минимальный воспроизводимый пример

Ответ №1:

Попробуйте выполнить следующие действия:

 correct_prediction = pd.Categorical([df['Correct Prediction (Insert None if none of the predictions are correct)'].tolist(), categories=[0,1,2, 3, 'NONE']) subject = pd.Categorical(df['Subject'].tolist(), categories=['Physics', 'Maths', 'Chemistry', 'Biology'])  pd.crosstab(correct_prediction, subject, normalize='columns')  

введите описание изображения здесь

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

1. Он также показывает другие результаты, чем ожидалось.

2. Не могли бы вы привести мне пример?

3. Конечно. Вы можете получить результаты, просто следуя самому последнему блоку кода в вопросе

4. Вы забыли добавить 4 categories=[0,1,2, 3, 'NONE'] . Он работает идеально, как и ожидалось. Спасибо за помощь.