来自不同列的元素计数的条形图 - 指导
Posted
技术标签:
【中文标题】来自不同列的元素计数的条形图 - 指导【英文标题】:Barplot for a count of elements from different columns - guidance 【发布时间】:2021-10-31 01:34:25 【问题描述】:根据给定的数据集,我需要给出 3 个条形图,它们对应于 Sites
列中的 3 个站点,A1
A2
或 A3
。
每个条形图都应给出每个站点的结果计数。结果是在PT1
和PT4
之间的最右边一列中发生的事情,忽略它左边发生的事情。
这是一个选择:NOT_FINISHED
NOT_TESTED
TOO_LOW
,150
和 190
之间的一个数字(由 5 分隔,所以 150、155、160...),或者什么都没有。
如果给定元素(行)在 PT1 到 PT4 列中没有条目,则不计算任何内容。
因此,每个条形图应该有 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
之间的数字(以 5 分隔) , 所以 150, 155, 160...)) 然后它计为 1 并将其添加到与“站点”相对应的条形图中。
然后,它移动到下一行并重复。
然而,如果在 TP4 中没有找到任何值,那么它会转到 TP3、TP2 等,直到找到一些东西。如果它在所有 4 列中均未找到任何内容,则不计算任何内容,我们只需转到下一行。
我希望这个澄清能有所帮助。
【问题讨论】:
出于好奇,您使用 Python 2.7 有什么原因吗? 不是一个好方法,这只是我为此提供的一个约束。我没有发言权 【参考方案1】:使用您的 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();
【讨论】:
谢谢,这有帮助。我得到一个“nan”列,它似乎在计算所有“null”值。我怎样才能摆脱该列,因为它没有用?另外,这段代码似乎只为 A3 输出了一个图,这是因为我在 python 2.7 上吗? 你的意思是无列还是空字符串列? plt.show();在循环中分开地块 在条形图中,我得到一个名为“nan”的棍子,价值非常高,我想将其移除。我将尝试将循环中的情节分开,我不完全确定这是如何完成的。 你 cab 使用 dropna() 函数,查找它。或另一种删除 nan 值的方法。并在情节之前删除它们。 flat_list = [x for x in flat_list if x is not np.nan] 您可以在两个 flat_list 行之后添加此行。它假设删除 nan(如果 nan 是一个字符串,则将 np.nan 修改为 'nan')以上是关于来自不同列的元素计数的条形图 - 指导的主要内容,如果未能解决你的问题,请参考以下文章