Сравните строки в кадре данных панд, чтобы определить совпадающие шаблоны - PullRequest
0 голосов
/ 04 октября 2018

У меня есть датафрейм с ответами на экзаменационные вопросы 1000 студентов.В каждой строке представлен 1 ученик, а в столбцах даны ответы на вопросы.

Я хотел бы сравнить каждого учащегося со следующим, а затем суммировать количество вопросов, на которые они ответили одинаково, и количество ответов, на которые он ответил по-разному.Затем я хотел бы, чтобы пут сравнения сравнивал идентифицирующие пары и итоговые значения ответов, которые были одинаковыми и разными

Это то, как далеко я получил с помощью кода для суммирования правильных ответов

    def match(a,b):
         sum_cor=sum(np.logical_and(df.loc[a,]==df.loc[b,],df.loc[a,]==5))
         print(sum_cor)

Данные

    Student   Q1   Q2   Q3   Q4  Q5  Q6  Q7  Q8
       0       5   5     4    5   5  5   2    4
       1       5   3     5    5   5  5   2    2
       2       5   5     5    5   5  5   5    2
       3       5   1     5    5   5  5   5    5
       4       5   5     5    5   5  5   5    4

Выход

      Row_1    Row_2  #_Match  #not_matched
       L00      L0      5         3
       L01      L1      5         3
       L02      L2      5         3

1 Ответ

0 голосов
/ 04 октября 2018

Ваш ввод:

         Q1  Q2  Q3  Q4  Q5  Q6  Q7  Q8
Student                                
0         5   5   4   5   5   5   2   4
1         5   3   5   5   5   5   2   2
2         5   5   5   5   5   5   5   2
3         5   1   5   5   5   5   5   5
4         5   5   5   5   5   5   5   4

Код:

def compare(d):
    return [sum(d == df.loc[i].values) for i in df.index]

df.set_index('Student', inplace=True)

answer = df.apply(compare, 1).apply(pd.Series)

answer = pd.concat([pd.DataFrame([[i, j, answer.loc[i, j]] for i in range(len(df))]) 
                    for j in range(len(df))])

answer = answer.rename(columns={0:'Row_1', 1:'Row_2', 2:'#_Match'})

answer['Row_1'] = 'L' + answer['Row_1'].astype(str)
answer['Row_2'] = 'L' + answer['Row_2'].astype(str)

answer['#not_matched'] = len(df.columns) - answer['#_Match']

Выход:

Row_1 Row_2  #_Match  #not_matched
0    L0    L0        8             0
1    L1    L0        5             3
2    L2    L0        5             3
3    L3    L0        4             4
4    L4    L0        6             2
0    L0    L1        5             3
1    L1    L1        8             0
2    L2    L1        6             2
3    L3    L1        5             3
...

Это то, что вы хотите?

Iизвините, мое решение очень большое и не оптимальное, но я надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...