来自无组织数据的条形图 - 创建数据框?
Posted
技术标签:
【中文标题】来自无组织数据的条形图 - 创建数据框?【英文标题】:Barplot from unorganised data - dataframe creation? 【发布时间】:2021-10-31 10:05:26 【问题描述】:从下表中,我需要创建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 |
+-------+----------+----------+----------+--------+----------+
【问题讨论】:
你能显示预期的输出吗> 我添加了一个示例,或多或少地展示了我希望 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])
以上是关于来自无组织数据的条形图 - 创建数据框?的主要内容,如果未能解决你的问题,请参考以下文章