首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有动态列名的Pandas数据帧上的水平条形图

具有动态列名的Pandas数据帧上的水平条形图
EN

Stack Overflow用户
提问于 2016-10-10 19:31:25
回答 2查看 1.6K关注 0票数 0

我有以下源数据(来自csv文件):

代码语言:javascript
复制
ABC,2016-6-9 0:00,95,"{'//Purple': [115L], '//Yellow': [403L], '//Blue': [16L], '//White-XYZ': [0L]}"
ABC,2016-6-10 0:00,0,"{'//Purple': [219L], '//Yellow': [381L], '//Blue': [90L], '//White-XYZ': [0L]}"
ABC,2016-6-11 0:00,0,"{'//Purple': [817L], '//Yellow': [21L], '//Blue': [31L], '//White-XYZ': [0L]}"
ABC,2016-6-12 0:00,0,"{'//Purple': [80L], '//Yellow': [2011L], '//Blue': [8888L], '//White-XYZ': [0L]}"
ABC,2016-6-13 0:00,0,"{'//Purple': [32L], '//Yellow': [15L], '//Blue': [4L], '//White-XYZ': [0L]}"
DEF,2016-6-16 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [3L]}"
DEF,2016-6-17 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [0L]}"
DEF,2016-6-18 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [7L]}"
DEF,2016-6-19 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [14L]}"
DEF,2016-6-20 0:00,0,"{'//Purple': [32L], '//Black': [15L], '//Pink': [4L], '//NPO-Green': [21L]}"

我使用How to remove curly braces, apostrophes and square brackets from dictionaries in a Pandas dataframe (Python)将数据转换为可以用来绘制特定变量的数据框架。数据框架如下(注意:与源csv文件中的数据不同,但结构相同):

代码语言:javascript
复制
   Company   Date         Code       Yellow     Blue        White      Black

0  ABC       2016-6-9     115        403         16         19         472     
1  ABC       2016-6-10    219        381         90         20         2474
2  ABC       2016-6-11    817        21          31         88         54
3  ABC       2016-6-12    80         2011        8888       0          21
4  ABC       2016-6-13    21         15          46         20         56
5  DEF       2016-6-16    64         42          76         4          41
6  DEF       2016-6-17    694        13          84         50         986
7  DEF       2016-6-18    325        485         38         60         174
8  DEF       2016-6-19    418        35          174        251        11
9  DEF       2016-6-20    50         56          59         19         03

我需要创建几个颜色的时间序列图(考虑到构建数据框架的方式,我可以很容易地做到这一点)。

但是,我也希望能够在特定日期的上绘制水平条形图(参见barplot.html中的一个例子)。

例如,根据我的数据,截至2016年6月9日,酒吧的地块看起来如下(而不是缩放):

代码语言:javascript
复制
Black:    ********************************

Yellow:   **************************

White:    ***

Blue:     **

我遇到的问题是,列名(例如“黄色”、“蓝色”、“白色”和“黑色”)可能会改变,列数也会改变。

有没有人知道是否有可能在“代码”列的右侧循环通过一定数量的列,然后使用这些列创建与上面类似的水平条形图?或者,把数据的一部分放在“代码”列的右边?

或者,数据帧本身是否需要有不同的结构,以便可以用来绘制时间序列图和水平条形图?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-10-10 20:24:56

为了在“代码”列的右边遍历一定数量的列,我会做一些形式上的事情

代码语言:javascript
复制
for col in df.columns[3:]:
    plot(col)

但是,只有当您能够保证您的列将始终保持相同的顺序时,这才有效。或者,您可以确保对该特定图表感兴趣的列以系统的方式命名。

希望这能有所帮助!

票数 0
EN

Stack Overflow用户

发布于 2016-10-10 20:56:45

你可以这样做:

原始DF:

代码语言:javascript
复制
In [127]: df
Out[127]:
  Company       Date  Code  Yellow  Blue  White  Black
0     ABC 2016-06-09   115     403    16     19    472
1     ABC 2016-06-10   219     381    90     20   2474
2     ABC 2016-06-11   817      21    31     88     54
3     ABC 2016-06-12    80    2011  8888      0     21
4     ABC 2016-06-13    21      15    46     20     56
5     DEF 2016-06-16    64      42    76      4     41
6     DEF 2016-06-17   694      13    84     50    986
7     DEF 2016-06-18   325     485    38     60    174
8     DEF 2016-06-19   418      35   174    251     11
9     DEF 2016-06-20    50      56    59     19      3

Date设置为索引:

代码语言:javascript
复制
In [128]: df = df.set_index('Date')

In [129]: df
Out[129]:
           Company  Code  Yellow  Blue  White  Black
Date
2016-06-09     ABC   115     403    16     19    472
2016-06-10     ABC   219     381    90     20   2474
2016-06-11     ABC   817      21    31     88     54
2016-06-12     ABC    80    2011  8888      0     21
2016-06-13     ABC    21      15    46     20     56
2016-06-16     DEF    64      42    76      4     41
2016-06-17     DEF   694      13    84     50    986
2016-06-18     DEF   325     485    38     60    174
2016-06-19     DEF   418      35   174    251     11
2016-06-20     DEF    50      56    59     19      3

In [130]: cols = df.drop(['Company','Code'], 1).columns.tolist()

In [131]: cols
Out[131]: ['Yellow', 'Blue', 'White', 'Black']

In [139]: %paste
import matplotlib
matplotlib.style.use('ggplot')

In [140]: df.ix['2016-06-09', cols].plot.barh(rot=0, color=cols)
Out[140]: <matplotlib.axes._subplots.AxesSubplot at 0x1890a898>

或者,如果您想要绘图,则排序如下:

代码语言:javascript
复制
In [142]: srt = df.ix['2016-06-09', cols].sort_values()

In [143]: srt.plot.barh(color=srt.index)
Out[143]: <matplotlib.axes._subplots.AxesSubplot at 0x1cf16748>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39965440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档