熊猫:按日历周分组,然后绘制实时日期的分组条形图

编辑

我找到了一个很好的解决方案,并将其作为答案发布在下面。
结果如下所示:


您可以为此问题生成的一些示例数据:

code=list('ABCDEFGH');
日期=pd.系列(pd.日期范围(“2013-11-01”、“2014-01-31”);
日期=日期。附加(日期)
dates.sort()
df=pd.DataFrame({'amount':np.random.randint(1,10,dates.size),'col1':np.random.choice(code,dates.size),'col2':np.random.choice(code,dates.size),'date':dates})

导致:

[55]on

:df
Output[55]:
col1 col2日期的金额
01 D E 2013-11-01
05 E B 2013-11-01
1.5 G A 2013-11-02
1 7 D H 2013-11-02
2 5 E G 2013-11-03
2 4 H G 2013-11-03
3 7 A F 2013-11-04
3 2013-11-04
4 1 E G 2013-11-05
4 7 D C 2013-11-05
5 C A 2013-11-06
5 7 H F 2013-11-06
61GB2013-11-07
6 8 D A 2013-11-07
71B H 2013-11-08
7 8 F H 2013-11-08
8 3 A E 2013-11-09
8.1日2013-11-09
2013年11月10日
9 1H G 2013-11-10
10 6 E 2013-11-11
10 6 F E 2013-11-11
11.2 G B 2013-11-12
11.5小时2013-11-12
12 5 F G 2013-11-13
12.5 G B 2013-11-13
13 8小时B 2013-11-14
13 6 G F 2013-11-14
14 9 F C 2013-11-15
14.4小时A 2013-11-15
..     ...  ...  ...        ...
77 9 A B 2014-01-17
77 7 E B 2014-01-17
78 4 F E 2014-01-18
78 6 B E 2014-01-18
79 6 A H 2014-01-19
79 3 G D 2014-01-19
80 7 E 2014-01-20
80 6克C 2014-01-20
81 9 H G 2014-01-21
81 9 C B 2014-01-21
82 2 D 2014-01-22
82 7 D A 2014-01-22
83 6 G B 2014-01-23
83 1 A G 2014-01-23
84 9 B D 2014-01-24
84 7 G D 2014-01-24
85 7 A F 2014-01-25
85 9 B H 2014-01-25
86 9 C D 2014-01-26
86 5 E B 2014-01-26
87 3 C H 2014-01-27
87 7 F D 2014-01-27
88 3 D G 2014-01-28
88 4 A D 2014-01-28
89 2 F A 2014-01-29
89 8 D A 2014-01-29
90 1 A G 2014-01-30
90 6 C A 2014-01-30
91 6 H C 2014-01-31
91 2 G F 2014-01-31
[184行x 4列]

我想按日历周和col1的值分组。像这样:

kw=lambda x:x.isocalendar()[1]
grouped=df.groupby([df['date'].map(kw),'col1'],sort=False)。agg({'amount':'sum'})

导致:

[58]on

:分组
Output[58]:
数量
日期col1
44 D 8
E10
G5
氢4
45天15
e1
G 1
h9
A 13
C5
B 4
F8
46 E 7
G 13
H17
B 9
F 23
47 G 14
氢4
A 40
C7
B 16
F 13
48天7
E16
G 9
h2
A 7
C7
B 2
...           ...
1小时14
A 14
B 15
F 19
2 D 13
H13
A 13
B 10
F 32
三维8
E 18
G 3
h6
A 30
C 9
B 6
F 5
4d9
E12
G 19
h9
A 8
C 18
B 18
5 D 11
G2
h6
A五
C 9
F9
[87行x 1列]

然后,我希望生成如下图:
这意味着:x轴上的日历周和日历年(日期时间)以及每个分组的col11条

我面临的问题是:我只有描述日历周的整数(绘图中的KW),但我必须以某种方式将日期合并回日历周,以获得按年份标记的刻度。此外,我不能只绘制分组日历周,因为我需要项目的正确顺序(kw 47、kw 48(2013年)必须位于kw 1的左侧(因为这是2014年))


编辑

我从这里了解到:
http://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization-条形图,分组的条形图需要是列而不是行。因此,我考虑了如何转换数据,并找到了方法pivot,这是一个很好的功能重置索引用于将多索引转换为列。最后,我将NaNs填充为零:

A=grouped.reset_index().pivot(index='date',columns='col1',values='amount')。fillna(0)

将数据转换为:

col1 A B C D E F G H
日期
1      4  31   0   0   0  18  13   8
2      0  12  13  22   1  17   0   8
3      3  10   4  13  12   8   7   6
4     17   0  10   7   0  25   7   4
5      7   0   7   9   8   6   0   7
44     0   0   2  11   7   0   0   2
45     9   3   2  14   0  16  21   2
46     0  14   7   2  17  13  11   8
47     5  13   0  15  19   7   5  10
48    15   8  12   2  20   4   7   6
49    20   0   0  18  22  17  11   0
50     7  11   8   6   5   6  13  10
51     8  26   0   0   5   5  16   9
52     8  13   7   5   4  10   0  11

它看起来像文档中的示例数据,以分组条的形式绘制:

A.绘图(种类='bar')

获取以下内容:

然而,我有轴的问题,因为它现在被排序(从1-52),这实际上是错误的,因为在这种情况下,日历周52属于2013年。。。有没有关于如何合并日历周的实时日期时间并将其用作x轴刻度的想法

我认为重采样(’W’)是一种更好的方法,默认情况下,它按星期日结束的星期分组(’W’与’W-SUN’相同),但您可以指定任何您想要的内容

在您的示例中,尝试以下方法:

分组=(df
.groupby('col1')
.apply(lambda g:#处理col1的组
g、 设置索引(“日期”)
['金额']]
.resample('W').agg('sum')#对数周内的金额字段求和
)
.unstack(level=0)#将col1索引行旋转到列
.fillna(0)
)
grouped.columns=grouped.columns.droplevel()#删除多索引列名的“col1”部分
打印分组
分组。绘图(kind='bar')

它应该打印您的数据表,并绘制一个与您的类似的绘图,但带有;“真正的”;日期标签:

col1 A B C D E F G H
日期
2013-11-03  18  0   9   0   8   0   0   4 
2013-11-10  4   11  0   1   16  2   15  2 
2013-11-17  10  14  19  8   13  6   9   8 
2013-11-24  10  13  13  0   0   13  15  10
2013-12-01  6   3   19  8   8   17  8   12
2013-12-08  5   15  5   7   12  0   11  8 
2013-12-15  8   6   11  11  0   16  6   14
2013-12-22  16  3   13  8   8   11  15  0 
2013-12-29  1   3   6   10  7   7   17  15
2014-01-05  12  7   10  11  6   0   1   12
2014-01-12  13  0   17  0   23  0   10  12
2014-01-19  10  9   2   3   8   1   18  3 
2014-01-26  24  9   8   1   19  10  0   3 
2014-02-02  1   6   16  0   0   10  8   13

发表评论