比较熊猫数据框中的行,以确定匹配的不匹配模式

时间:2018-10-04 14:34:30

标签: python pandas numpy

我有一个数据框,其中包含对1,000名学生的考试题的答案。每行代表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 :(得分:0)

您的输入:

         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
...

是您想要的吗?

很抱歉,我的解决方案很大,而且不是最佳解决方案,但希望对您有所帮助。