#python #pandas #dataframe #rows
#python #pandas #фрейм данных #строки
Вопрос:
У меня есть этот основной df1:
Name | Course | Q_1 | Q_2 | ... | Q_60
John | Phys | A | C | ... | D
Karen| Math | C | C | ... | E
... | ... | ... | ... | ... | ...
(~ 1200 имен)
Ключевым ответом для справки является df2:
1 2 3 4 ... 60
A | C | C | E | ... | D
Я хочу сравнить df1 с df2, чтобы ответить на вопросы этого типа:
- На какие вопросы учащиеся ответили правильно?
- Сколько студентов правильно ответили на Q_3, Q_4, Q_5 и Q_10?
Я уже пытался просто выполнить условное сравнение, но это дает мне только np.массив логических значений: возможно ли индексировать позицию совпадений True / False с любым заданным ответом, возвращая что-то вроде:
df3:
Name | Course | Q_1 | Q_2 | ... |Q_60
John | Phys |True |True | ... |True
Karen| Math |False|True | ... |False
...........
А затем произвести условное подсчет истинных совпадений, сохраняя их позицию, чтобы получить решение?
Комментарии:
1. Можете ли вы поделиться тем, что вы сделали до сих пор, и что, по вашему мнению, будет потенциальным ответом. Мы рассмотрим и предоставим вам комментарии, которые приведут вас в правильном направлении.
2. У меня есть фрейм данных с 4 листами: два из них содержат ответы, данные студентами, в результате чего получается 60 ответов для каждого из них ( 30 предварительных тестов 30 pos-тестов, но сам тест тот же !!); 3-й лист — это таблица ключевых ответов, 30 правильных ответов которой должны служить руководством для сравнения индивидуальных ответов (на 4-м просто хранятся вычисления). Я застрял на сравнении ответов учащегося с 3-м листом таким образом, чтобы было возможно определить, КАКИЕ (конкретно) из них были правильными.
3. Мне уже удалось вычислить количество правильных ответов, просто ‘if сравнивая’ (оператор ‘==’), например: right_answers = np.array(данные [ids_answer] == np.array (key_answer); но понятия не имею, как сохранить правильную позицию этих ребят в фрейме данных ( df1 ) для будущей проверки (в центре внимания, опять же, 2 вопроса, которые я исправил в сообщении). В любом случае, заранее спасибо, любое предложение может помочь!
Ответ №1:
Используйте add_preffix
и eq
:
t=df2.add_prefix('Q_').iloc[0]
df1.set_index(['Name','Course']).eq(t,1).reset_index()
Пример
С фиктивными данными:
print(df1)
Name Course Q_1 Q_2 Q_3
0 John Phys A C D
1 Karen Math C C E
print(df2)
1 2 3
0 A C C
t=df2.add_prefix('Q_').iloc[0]
df1.set_index(['Name','Course']).eq(t,1).reset_index()
Name Course Q_1 Q_2 Q_3
0 John Phys True True False
1 Karen Math False True False
Комментарии:
1. Не сработало: он просто добавляет 60 новых столбцов с новым индексом ‘Q_[number]’ в df1, а все выходные значения становятся «false», и появляется эта ошибка: «FutureWarning: поэлементное сравнение не удалось; вместо этого возвращается scalar, но в будущем будет выполняться поэлементное сравнение res_values = method(rvalues)»
2. reset_index() также применялся не очень хорошо: индексы путаются, например, при вводе Q_9 в конце, потому что, похоже, он не видит составных чисел, например , ’53’, ’78’ или ’25’ вместо этого ‘5’ ‘3’, ‘7’ ‘8’ и так далее… В любом случае, спасибо за ответ.