Сравнение фрейма данных ‘key answer’ и ‘answers’ в Pandas

#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’ и так далее… В любом случае, спасибо за ответ.