来自无组织数据的条形图 - 数据框创建?

Barplot from unorganised data - dataframe creation?

根据下面的table,我需要创建4个不同的条形图,对应于4个不同的地方TST1 TST2 TST3 TST4 TST5

每个条形图应有 8 个刻度,用于 NOT_DONE INCOMP UNTESTED 30 35 40 45 50 如果可能的话,按这个顺序。刻度将对应于每个“值”在给定位置出现的次数。 (这些地方是 4 个选项之一:L1 L2 L3 L4

然而:

如果在 TST5 中没有找到任何值,则只有最右侧列中的值才被认为是有意义的,然后程序应该检查 TST4 等,直到找到一个值。如果在这 5 列中的任何一列中均未找到任何值,则不会计算任何值。如果找到一个值,那么它与它左边的内容无关。

我的想法是创建一个新的列数据框,其中包含我需要的值(因此每一行的最正确的值)及其对应的位置。我是这一切的新手,不确定如何去做,所以非常感谢任何帮助我朝哪个方向前进。

我需要使用python 2.7,我也在使用seaborn进行绘图。

+-------+----------+----------+----------+--------+----------+
| PLACE | TST1     | TST2     | TST3     | TST4   | TST5     |
+-------+----------+----------+----------+--------+----------+
| L1    |          | NOT_DONE |          |        | 50       |
+-------+----------+----------+----------+--------+----------+
| L1    |          |          | 35       |        |          |
+-------+----------+----------+----------+--------+----------+
| L4    |          |          |          |        |          |
+-------+----------+----------+----------+--------+----------+
| L3    |          |          | INCOMP   |        |          |
+-------+----------+----------+----------+--------+----------+
| L2    | UNTESTED |          |          | INCOMP |          |
+-------+----------+----------+----------+--------+----------+
| L3    |          |          |          |        |          |
+-------+----------+----------+----------+--------+----------+
| L4    |          | 30       |          |        |          |
+-------+----------+----------+----------+--------+----------+
| L3    |          | INCOMP   | 40       |        |          |
+-------+----------+----------+----------+--------+----------+
| L4    |          |          |          |        | UNTESTED |
+-------+----------+----------+----------+--------+----------+
| L1    |          |          |          |        |          |
+-------+----------+----------+----------+--------+----------+
| L3    |          | INCOMP   |          |        |          |
+-------+----------+----------+----------+--------+----------+
| L2    |          |          |          |        |          |
+-------+----------+----------+----------+--------+----------+
| L2    |          | 50       |          |        |          |
+-------+----------+----------+----------+--------+----------+
| L3    |          |          | UNTESTED | 35     | NOT_DONE |
+-------+----------+----------+----------+--------+----------+
| L1    |          |          |          |        |          |
+-------+----------+----------+----------+--------+----------+
| L2    |          | 40       |          | INCOMP |          |
+-------+----------+----------+----------+--------+----------+
| L3    |          |          |          |        |          |
+-------+----------+----------+----------+--------+----------+
| L1    |          |          |          |        |          |
+-------+----------+----------+----------+--------+----------+
| L4    |          | NOT_DONE |          | 30     | NOT_DONE |
+-------+----------+----------+----------+--------+----------+

I am required to use python 2.7, I am also using seaborn for the plotting.

在 python 2.7.18 和 pandas 0.24.2 上测试(虽然它在 python 3 中工作正常):

  1. 使用 ffill 沿 columns 传播最右边的值(忽略 PLACE):

    df['TST'] = df.drop(columns='PLACE').ffill(axis='columns').iloc[:, -1]
    
  2. PLACE 分组并得到他们的 value_counts:

    data = df.groupby('PLACE')['TST'].value_counts().reset_index(name='COUNT')
    
    #   PLACE       TST  COUNT
    # 0    L1        35      1
    # 1    L1        50      1
    # 2    L2    INCOMP      2
    # 3    L2        50      1
    # 4    L3    INCOMP      2
    # 5    L3        40      1
    # 6    L3  NOT_DONE      1
    # 7    L4        30      1
    # 8    L4  NOT_DONE      1
    # 9    L4  UNTESTED      1
    
  3. 然后将此 data 传递到 catplot(使用 order 参数设置您的首选订单顺序):

    incompletes = ['NOT_DONE', 'INCOMP', 'UNTESTED']
    ticks = incompletes + sorted(data.TST.unique())[:len(incompletes)]
    
    g = sns.catplot(x='TST', y='COUNT', col='PLACE', col_wrap=2,
                    data=data, order=ticks, kind='bar')
    g.set_xticklabels(rotation=90)
    


版本:

>>> sys.version
2.7.18 (default, Mar 15 2021, 14:29:03) \n[GCC 10.2.0]
>>> pandas.__version__
0.24.2
>>> matplotlib.__version__
2.2.5
>>> seaborn.__version__
0.9.1