dataframe的行和列之间的Python交互
我有这个数据框:dataframe的行和列之间的Python交互,python,pandas,Python,Pandas,我有这个数据框: print (df) exam student 0 French a 1 English a 2 Italian a 3 Chinese b 4 Russian b 5 German b 6 Chinese c 7 Spanish c 8 English c 9
print (df)
exam student
0 French a
1 English a
2 Italian a
3 Chinese b
4 Russian b
5 German b
6 Chinese c
7 Spanish c
8 English c
9 French c
我需要找出每个学生参加和他一样的考试的人数
应该是这样的:
exam student total_st
0 French a 1
1 English a 1
2 Italian a 1
3 Chinese b 1
4 Russian b 1
5 German b 1
6 German c 2
7 Spanish c 2
8 English c 2
9 French c 2
学生A的总数是1,因为它只有一个学生参加普通考试(在本例中是学生C)
学生B的总数是1,因为它只有一个学生参加普通考试(在本例中是学生C)
学生C的总数为2,因为它与两个学生(学生A和B)都有共同的考试
有什么想法吗
提前谢谢你 您可以首先计算
考试
和学生
的列联表,然后进行叉积以检查学生之间是否有考试重叠,并计算至少有一次共享考试的学生人数,并将结果映射到原始学生列:
cont_table = pd.crosstab(df.exam, df.student)
# cont_table.T.dot(cont_table) gives a table how many exams each student shared with
# another student, -1 to exclude the student himself
shared_count = (cont_table.T.dot(cont_table) != 0).sum(0) - 1
shared_count
#student
#a 1
#b 1
#c 2
#dtype: int64
df['total_st'] = df.student.map(shared_count)
df
您可以首先计算
考试
和学生
的列联表,然后进行叉积以检查学生之间是否存在考试重叠,并计算至少有一次共享考试的学生人数,并将结果映射到原始学生列:
cont_table = pd.crosstab(df.exam, df.student)
# cont_table.T.dot(cont_table) gives a table how many exams each student shared with
# another student, -1 to exclude the student himself
shared_count = (cont_table.T.dot(cont_table) != 0).sum(0) - 1
shared_count
#student
#a 1
#b 1
#c 2
#dtype: int64
df['total_st'] = df.student.map(shared_count)
df
非常有趣的解决方案@谢谢你的评论!伟大的非常感谢。非常有趣的解决方案@谢谢你的评论!伟大的非常感谢。