首页 > 解决方案 > 来自不同列的元素计数的条形图 - 指导

问题描述

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

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

这是一个选择: , &之间NOT_FINISHED NOT_TESTED TOO_LOW的数字(由 5 分隔,所以 150、155、160...),或者什么都没有。如果给定元素(行)的列 PT1 到 PT4 中没有条目,则不计算任何内容。150190

因此,每个条形图应该有 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_LOW150190并将其添加到与“站点”对应的条形图中。然后,它移动到下一行并重复。

但是,如果在 TP4 中没有找到任何值,那么它会转到 TP3、TP2 等,直到找到一些东西。如果它在所有 4 列中均未找到任何内容,则不计算任何内容,我们只需转到下一行。

我希望这个澄清能有所帮助。

标签: pythonpandaspython-2.7matplotlibcharts

解决方案


使用您的 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();

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述


推荐阅读