【问题标题】:Pandas - Bar chart with grouped-data, with the order of groups being sorted by data from another listPandas - 带有分组数据的条形图,组的顺序按另一个列表中的数据排序
【发布时间】:2016-11-02 01:24:17
【问题描述】:

要求:

  • 我正在尝试创建一个条形图,其中对于每个条件(“标签”),我会显示每个操作(“模式”)的平均任务时间。因此,将有 8 组,每组 3 个小节,一组只有一个小节。
  • 我需要在每个条上显示误差线(标准误差)。
  • 我希望通过使用其他一些指标完成的一些计算来确定每个条件/标签的顺序。 (这些我已经从标签 ==> 索引/顺序中提取到字典映射中)
  • 我将绘制其他一些图表,其中使用的任何排序顺序在其他图表中也必须相同
  • 这适用于 Python 2.7、Pandas 0.18 和 IPython Notebook
  • (数据帧是从csv文件加载的,不是直接构造的)

问题:

所以,这就是图表当前的样子:

Current Graph

我已经替换/删除了此处上传的标签,但是,就像这些标签一样,原件也是按字母顺序排序的。

这就是问题所在:希望每种技术都按字母顺序排序。相反,我希望它们根据我在单独列表中获得的排序顺序进行排序(即,这样我就可以让它们按顺序显示 - 从最短到最高,同时保持相同的顺序图表)。

当前代码:

所以,我从 csv 文件加载完整的数据集:

p = pd.read_csv("...", sep='\t')

然后,我使用 groupby 提取“task_time”数据来绘制每个条形:

tt_all = p.groupby(['label', 'pattern'])[['task_time']]

然后通过以下方式绘制:

tt_all.mean().unstack().plot(kind='bar', yerr=tt_all.sem().unstack(), figsize=(15, 6), cmap=cmap, edgecolor='None', rot=45)

(如果没有 unstack(),它只会将所有内容都归为一个类别并造成混乱)

我尝试过的:

经过一番摸索,我设法得到了以下信息:

# Create a column to use for sorting things
sort_order_keys = {'I': 8, 'F': 3, 'H': 7, 'G': 1, 'D': 2, 'C': 5, 'E': 6, 'A': 4, 'B': 0}
p['label_sort_key'] = p['label'].apply(lambda x: sort_order_keys[x])  

# This sorts all the rows by the sort order
tt_all_raw = p.sort(['label_sort_key', 'pattern'])
tt_all_raw = tt_all_raw.iloc[tt_all_raw['label_sort_key'].argsort()]
print tt_all_raw     # <--- This will be sorted correctly

# Performing grouping....
tt_all = tt_all_raw.groupby(['label', 'pattern'], sort=False)[['task_time']]
print tt_all.mean()   # <---- This will also be sorted correctly

print tt_all.mean().unstack()  # <--- This however forces everything back to alphabetical order! Argh!

问题

  • 如何重新排序 unstack() 结果?或
  • 有没有更简单的方法来设置这样的图表,满足这些要求?

【问题讨论】:

    标签: sorting pandas matplotlib bar-chart


    【解决方案1】:

    我遇到了同样的问题,我通过将 GroupBy object 更改为 DataFrame 并将有序类别作为列表传递给 index 参数来绕过这个问题。

    这对你有用吗?

    sort_order_keys = ['B', 'G', 'D', 'F', 'A', 'C', 'E', 'H', 'I']
    tt_all = pandas.DataFrame(tt_all, index = sort_order_keys)
    

    然后您应该能够在数据框上使用绘图功能。

    在组上使用.count() 方法时,我发现在将dict() 转换为字典之前使用dict() 将其传递给pandas.DataFrame() 函数并将组标签用作标签很有用列并将index 命名为“计数”,例如:

    tt_allCount = pandas.DataFrame(dict(tt_all.count()), 
                                        columns = sort_order_keys,
                                        index=['count'])
    

    【讨论】:

      【解决方案2】:

      我认为您可以将CategoricalIndex 与具有自定义顺序的类别一起使用,这很容易按sort_index 排序:

      print (p)
        label  pattern  task_time
      0     I        0          3
      1     E        0          0
      2     B        1          2
      3     D        1          1
      4     G        1          0
      5     F        0          3
      6     H        0          0
      7     D        1          2
      8     A        1          1
      9     C        1          0
      
      tt_all = p.groupby(['label', 'pattern'])[['task_time']]
      print (tt_all.mean())
                     task_time
      label pattern           
      A     1              1.0
      B     1              2.0
      C     1              0.0
      D     1              1.5
      E     0              0.0
      F     0              3.0
      G     1              0.0
      H     0              0.0
      I     0              3.0
      
      df1 = tt_all.mean().unstack()
      df1.index = pd.CategoricalIndex(df1.index, 
                                      categories=['B', 'G', 'D', 'F', 'A', 'C', 'E', 'H', 'I'], 
                                      ordered=True)
      df1.sort_index(inplace=True)
      print (df1)
              task_time     
      pattern         0    1
      B             NaN  2.0
      G             NaN  0.0
      D             NaN  1.5
      F             3.0  NaN
      A             NaN  1.0
      C             NaN  0.0
      E             0.0  NaN
      H             0.0  NaN
      I             3.0  NaN
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      相关资源
      最近更新 更多