在python 2.7.3上使用pandas 0.11我试图使用以下值来旋转一个简单的数据帧:
StudentID QuestionID Answer DateRecorded
0 1234 bar a 2012/01/21
1 1234 foo c 2012/01/22
2 4321 bop a 2012/01/22
3 5678 bar a 2012/01/24
4 8765 baz b 2012/02/13
5 4321 baz b 2012/02/15
6 8765 bop b 2012/02/16
7 5678 bop c 2012/03/15
8 5678 foo a 2012/04/01
9 1234 baz b 2012/04/11
10 8765 bar a 2012/05/03
11 4321 bar a 2012/05/04
12 5678 baz c 2012/06/01
13 1234 bar b 2012/11/01
我使用以下命令:
df.pivot(index='StudentID', columns='QuestionID')
但是我收到以下错误:
ReshapeError: Index contains duplicate entries, cannot reshape
请注意没有最后一行的相同数据框
13 1234 bar b 2012/11/01
枢轴结果成功地显示在以下内容中:
Answer DateRecorded
QuestionID bar baz bop foo bar baz bop foo
StudentID
1234 a b NaN c 2012/01/21 2012/04/11 NaN 2012/01/22
4321 a b a NaN 2012/05/04 2012/02/15 2012/01/22 NaN
5678 a c c a 2012/01/24 2012/06/01 2012/03/15 2012/04/01
8765 a b b NaN 2012/05/03 2012/02/13 2012/02/16 NaN
我是新手,我想知道为什么有重复的StudentID,QuestionID对会导致这个问题?而且,我如何使用df.pivot()函数修复此问题?
谢谢。答案 0 :(得分:5)
您希望您的数据透视表与重复条目一样?我不确定在数据透视表中为(1234,bar)设置多个元素是否有意义。您的数据看起来很自然地被索引(questionID,studentID,dateRecorded)。
如果你采用分层索引方法(它们真的不那么复杂!)我会尝试:
In [104]: df2 = df.set_index(['StudentID', 'QuestionID', 'DateRecorded'])
In [105]: df2
Out[105]:
Answer
StudentID QuestionID DateRecorded
1234 bar 2012/01/21 a
foo 2012/01/22 c
4321 bop 2012/01/22 a
5678 bar 2012/01/24 a
8765 baz 2012/02/13 b
4321 baz 2012/02/15 b
8765 bop 2012/02/16 b
5678 bop 2012/03/15 c
foo 2012/04/01 a
1234 baz 2012/04/11 b
8765 bar 2012/05/03 a
4321 bar 2012/05/04 a
5678 baz 2012/06/01 c
1234 bar 2012/11/01 b
In [106]: df2.unstack('QuestionID')
Out[106]:
Answer
QuestionID bar baz bop foo
StudentID DateRecorded
1234 2012/01/21 a NaN NaN NaN
2012/01/22 NaN NaN NaN c
2012/04/11 NaN b NaN NaN
2012/11/01 b NaN NaN NaN
4321 2012/01/22 NaN NaN a NaN
2012/02/15 NaN b NaN NaN
2012/05/04 a NaN NaN NaN
5678 2012/01/24 a NaN NaN NaN
2012/03/15 NaN NaN c NaN
2012/04/01 NaN NaN NaN a
2012/06/01 NaN c NaN NaN
8765 2012/02/13 NaN b NaN NaN
2012/02/16 NaN NaN b NaN
2012/05/03 a NaN NaN NaN
否则,您可以提出一些规则来确定为数据透视表采取的多个条目中的哪一个,并避免使用Hierarchical索引。
答案 1 :(得分:0)
您可以手动汇总数据,而不是依赖Pandas(当然这更好)。
list_val = '["apple", "blue", "green", "orange", "cherry", "white", "red", "violet"]'
print type(list_var)
str
print type(list_var[0])
'['
正如您在示例中看到的那样,pandas数据帧是从某些阵列构建的,然后手动聚合表。 我这样做是因为我没有时间学习更多的熊猫。