来自不同列的元素计数的条形图 - 指导

Posted

技术标签:

【中文标题】来自不同列的元素计数的条形图 - 指导【英文标题】:Barplot for a count of elements from different columns - guidance 【发布时间】:2021-10-31 01:34:25 【问题描述】:

根据给定的数据集,我需要给出 3 个条形图,它们对应于 Sites 列中的 3 个站点,A1 A2A3

每个条形图都应给出每个站点的结果计数。结果是在PT1PT4 之间的最右边一列中发生的事情,忽略它左边发生的事情。

这是一个选择:NOT_FINISHEDNOT_TESTEDTOO_LOW150190 之间的一个数字(由 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_FINISHEDNOT_TESTEDTOO_LOW150190 之间的数字(以 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')

以上是关于来自不同列的元素计数的条形图 - 指导的主要内容,如果未能解决你的问题,请参考以下文章

逻辑矩阵的 Pandas Groupby 条形图

如何制作分类列计数子集的条形图?

日期箱内变量计数的堆积条形图

Seaborn 条形图排序

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

在python中绘制条形图[重复]