来自无组织数据的条形图 - 数据框创建?
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 中工作正常):
使用 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
根据下面的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 中工作正常):
使用
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