#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']
. Он работает идеально, как и ожидалось. Спасибо за помощь.