绘制熊猫时间和类别

时间:2015-04-12 02:23:22

标签: python pandas matplotlib

我真的无法摆脱这个。这是我的表:

其中等级可以是A,B,C

doc_id, grade, timestamp
1, A, 27/01/15
2, A, 27/01/15
3, B, 27/01/15
...

我的目标是显示一条包含三行的图表,显示我通过时间获得了多少A,B和C.

我只能想到这个:

docs[docs['grade']== 'A'].groupby('time').count()
docs[docs['grade']== 'B'].groupby('time').count()
docs[docs['grade']== 'C'].groupby('time').count()

并将它们结合起来如何,但已经很清楚我的方法是错误的,

任何提示?

2 个答案:

答案 0 :(得分:1)

试试这个:

df2 = df.groupby(['timestamp', 'grade']).grade.size().unstack().cumsum().ffill().fillna(0)

它基本上按日期和等级进行调整,累计累计金额。

>>> df2
grade       A  B   C
timestamp           
4/1/15      0  1   0
4/11/15     4  1   2
4/3/15      4  4   2
4/4/15      4  5   3
4/5/15      4  6   3
4/6/15      7  6   6
4/8/15      9  6   8
4/9/15     13  7  12

enter image description here

如果您不想累积总和,可以使用:

df2 = df.groupby(['timestamp', 'grade']).grade.size().unstack().fillna(0)

答案 1 :(得分:1)

input_data成为

       grade timestamp
doc_id                
1          A  27/01/15
2          A  27/01/15
3          B  27/01/15
4          C  27/01/15
5          A  27/01/16
6          A  27/01/16
7          A  27/01/16
8          B  27/01/16
9          B  27/01/16
10         C  27/01/16
11         A  27/01/16
12         B  27/01/16
13         C  27/01/16
14         C  27/01/16

因此,为了显示一条包含三行的图表,显示您通过时间获得了多少A,B和C,您可以使用

result = input_data.groupby(['timestamp']).apply(lambda x: x.grade.value_counts())

输出将是这样的

           A  B  C
timestamp         
27/01/15   2  1  1
27/01/16   4  3  3

您可以使用result.plot()绘制数据。