python - 来自不同列的元素计数的条形图 - 指导
问题描述
根据给定的数据集,我需要给出 3 个条形图,它们对应于Sites
列中的 3 个站点,A1
A2
或者A3
.
每个条形图应给出每个站点的结果计数。PT1
结果是在和之间的最右边一列中发生的事情PT4
,而忽略左侧发生的事情。
这是一个选择: , &之间NOT_FINISHED
NOT_TESTED
TOO_LOW
的数字(由 5 分隔,所以 150、155、160...),或者什么都没有。如果给定元素(行)的列 PT1 到 PT4 中没有条目,则不计算任何内容。150
190
因此,每个条形图应该有 12 个棒,对应于每个可能结果的计数。
下面是我的数据集的摘录。
我对这一切都是新手,我不一定要求直接解决方案,而只是在可能的情况下从哪里开始提供一些指导。
使用 python 2.7、seaborn、pandas 和 matplotlib。
pd.DataFrame({'ID': {0: 'GF342', 1: 'IF874', 2: 'FH386', 3: 'KJ190', 4: 'TY748', 5: 'YT947', 6: 'DF063', 7: 'ET512', 8: 'GC714', 9: 'SD978', 10: 'EF472', 11: 'PL489', 12: 'AZ315', 13: 'OL821', 14: 'HN765', 15: 'ED589'}, 'Sites': {0: 'A1', 1: 'A3', 2: 'A1', 3: 'A3', 4: 'A3', 5: 'A2', 6: 'A3', 7: 'A1', 8: 'A2', 9: 'A3', 10: 'A1', 11: 'A2', 12: 'A1', 13: 'A1', 14: 'A3', 15: 'A1'}, 'NEW': {0: 'YES', 1: 'NO', 2: 'NO', 3: 'YES', 4: 'YES', 5: 'NO', 6: 'NO', 7: 'YES', 8: 'NO', 9: 'NO', 10: 'NO', 11: 'YES', 12: 'NO', 13: 'YES', 14: 'YES', 15: 'YES'}, 'YEAR': {0: 2021, 1: 2018, 2: 2019, 3: 2021, 4: 2021, 5: 2019, 6: 2019, 7: 2021, 8: 2018, 9: 2019, 10: 2018, 11: 2021, 12: 2018, 13: 2021, 14: 2021, 15: 2021}, 'PT1': {0: '', 1: 'NOT_TESTED', 2: '', 3: 'NOT_FINISHED', 4: '165', 5: '', 6: '180', 7: '145', 8: '155', 9: '', 10: '', 11: '', 12: 'TOO_LOW', 13: '150', 14: '155', 15: ''}, 'PT2': {0: '', 1: '', 2: '', 3: '', 4: '', 5: 'TOO_LOW', 6: '', 7: '', 8: '160', 9: 'TOO_LOW', 10: '', 11: '', 12: '', 13: '', 14: '', 15: ''}, 'PT3': {0: '', 1: 'TOO_LOW', 2: '', 3: 'TOO_LOW', 4: '', 5: '', 6: '', 7: '', 8: '', 9: '', 10: '', 11: 'NOT_FINISHED', 12: '', 13: '185', 14: '', 15: '165'}, 'PT4': {0: '', 1: '', 2: '', 3: '', 4: '', 5: 165.0, 6: '', 7: '', 8: '', 9: '', 10: '', 11: '', 12: 180.0, 13: '', 14: '', 15: ''}})
编辑:
换句话说,对于每一行,我需要程序首先检查 TP4,如果 TP4 有一个NOT_FINISHED
NOT_TESTED
TOO_LOW
值150
(190
并将其添加到与“站点”对应的条形图中。然后,它移动到下一行并重复。
但是,如果在 TP4 中没有找到任何值,那么它会转到 TP3、TP2 等,直到找到一些东西。如果它在所有 4 列中均未找到任何内容,则不计算任何内容,我们只需转到下一行。
我希望这个澄清能有所帮助。
解决方案
使用您的 df 的工作解决方案:
# make a list (x_labels) of all the possible values from Pi columns:
t = df[['PT1','PT2','PT3','PT4']].values
flat_list = [item for sublist in t for item in sublist]
flat_list = [x for x in flat_list if x != '']
x_labels = flat_list.copy()
# create bar plots:
for i,group in df.groupby('Sites'):
t = group[['PT1','PT2','PT3','PT4']].values
flat_list = [item for sublist in t for item in sublist]
flat_list = [x for x in flat_list if x != '']
unique, counts = np.unique(flat_list, return_counts=True)
for label in x_labels:
if label not in unique:
unique = np.append(unique, label)
counts = np.append(counts, 0)
unique, counts = zip(*sorted(zip(unique, counts)))
plt.bar(unique, counts)
plt.xticks(rotation=45)
plt.title(i)
plt.show();
推荐阅读
- android - 证书固定和 SSL
- ios - 使用 swift lint 进行 lint 时不排除 pod
- nativescript - 暂时关闭 ListView 中的滚动
- c# - Azure IoT 中心 - 减少数据下载/上传
- javascript - 基于字符串值的数组排序不起作用
- python-3.x - AttributeError:“AxesSubplot”对象没有属性“保持”
- php - 将商品更新到购物车(package-->darryldecode)Laravel 5.7
- c# - 字典按哈希而不是按顺序排序
- performance - 利用全部处理器容量并行运行 npm 脚本
- ruby-on-rails - 在 Ruby on Rails 中使用 axlsx 时是否可以修改现有样式对象?