"奇妙"是一个充满感情的词。
假设我有5名学生:A,B,C,D和E.这些学生中的每一个都在写作作业中对两个同学进行评分。数据如下:
peer_review = pd.DataFrame({
'Student': ['A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D', 'E', 'E'],
'Assessor': ['B', 'C', 'A', 'D', 'D', 'D', 'B', 'D', 'D', 'D', 'A', 'A', 'A', 'E', 'C', 'E'],
'Score': [72, 53, 92, 100, 2, 90, 75, 50, 50, 47, 97, 86, 41, 17, 47, 29]})
现在,在某些情况下,评估员不止一次对学生的作业进行评分。也许学生把它翻过来并修改了好几次。也许评估员喝醉了,并且不记得他已经给这个学生的作业评分了。无论如何,我希望能够看到每个评估员给每个学生的所有分数列表。我试着这样做:
peer_review.pivot_table(
index='Student',
columns='Assessor',
values='Score',
aggfunc=identity)
我已经可以听到你问 - 什么是"身份"功能?就是这样:
def identity(x):
return x
但是,当我重复运行pivot_table函数时,每次为具有多个值的单元格提供不同的答案。
所以,问题如下:
------------------更新#1:------------------
我发现它是一个被传递给身份函数的pandas Series对象。我将身份功能更改为:
def identity(x):
return x.values
这仍然给了我奇怪的随机数字。意识到x.values是一个numpy.ndarray,然后我尝试了这个:
def identity(x):
return x.values.tolist()
这会导致ValueError异常。 ("功能不会减少。")
------------------更新#2:------------------
ZJS提出的解决方法非常有效。仍然想知道为什么pivot_table让我失望。
答案 0 :(得分:3)
每次都会这样......
groups = peer_review.groupby(['Assessor','Student']) #groups into Assessor,Student combos
peer_review = groups.apply(lambda x:list(x['Score'])) #apply your group function
peer_review =peer_review.unstack('Student') #Set student index as the columns
我还在调查为什么pivot_table不起作用