Python Pandas DataFrame pivot_table奇怪的值

时间:2014-08-04 15:55:23

标签: python pandas

"奇妙"是一个充满感情的词。

假设我有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. 当我重复运行pivot_table函数时,似乎随机变化的数字有什么意义?
  2. 当评估员多次评估同一作业时,如何修复身份功能以便返回所有分数的简单列表?
  3. ------------------更新#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让我失望。

1 个答案:

答案 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不起作用