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

Posted

技术标签:

【中文标题】来自无组织数据的条形图 - 创建数据框?【英文标题】:Barplot from unorganised data - dataframe creation? 【发布时间】:2021-10-31 10:05:26 【问题描述】:

从下表中,我需要创建4个不同的条形图,对应4个不同的地方TST1TST2TST3TST4TST5

如果可能,每个条形图应该有 8 个刻度,对应 NOT_DONEINCOMPUNTESTED3035404550。刻度将对应于每个“值”出现在该给定位置的次数。 (这些地方是 4 个选项之一:L1L2L3L4

但是:

如果在 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 |
+-------+----------+----------+----------+--------+----------+

【问题讨论】:

你能显示预期的输出吗> 我添加了一个示例,或多或少地展示了我希望 L3 的条形图看起来像什么,希望对您有所帮助。 【参考方案1】:

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

在 python 2.7.18 和 pandas 0.24.2 上测试(尽管它在 python 3 中运行良好):

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

    df['TST'] = df.drop(columns='PLACE').ffill(axis='columns').iloc[:, -1]
    

    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
    

    然后将此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

【讨论】:

非常感谢,这很棒,并且完全按照预期工作。假设我的数字范围大于 30-50,更像是 60-150。是否有一种更“优雅”的方式来写“ticks=”行而不是手动输入每个数字?当它们很少时手写它们是可以的,但当范围大得多时就不行了。 @codingamat 这有点棘手,因为如果你想让单词排在第一位。我用一个选项更新了答案:手动输入单词(incompletes 列表)并将它们与排序后的数字组合(sorted(data.TST.unique())[:len(incompletes)])。 非常感谢您的帮助。这个解决方案在我的情况下似乎不太有效,我找到了另一种效果很好的方法。首先,我使用了num_range = list(range(60,151, 5)),然后我使用了您用于不完整代码的同一行代码incompletes = ['NOT_DONE', 'INCOMP', 'UNTESTED'] 对于最后一行代码,我基于您使用的代码行,但对其进行了一些更改:ticks = incompletes + ([str(num) for num in num_range])

以上是关于来自无组织数据的条形图 - 创建数据框?的主要内容,如果未能解决你的问题,请参考以下文章

使用两个数据框绘制并排条形图

在 r ggplot2 中为百分比值创建条形图

用均值条形图及其标准差 ggplot2 总结数据框

在绘制条形图时尝试更改数字格式

创建 100% 堆叠条形图

如何为 R 中使用百分比而不是计数作为 y 轴的数据框创建条形图?