Столбчатая диаграмма для подсчета элементов из разных столбцов — руководство

#python #pandas #python-2.7 #matplotlib #charts

Вопрос:

В соответствии с данным набором данных мне нужно дать 3 гистограммы, которые соответствуют 3 сайтам из Sites столбца, A1 A2 или A3 .

Каждый штрих-график должен содержать подсчет результатов для каждого сайта. Результат-это то , что произошло в самой правой колонке между PT1 и PT4 , не обращая внимания на то, что произошло слева от нее.

Это выбор между: NOT_FINISHED NOT_TESTED TOO_LOW , числом между 150 amp; 190 (разделенным на 5, так что 150, 155, 160…) или ничем. Если в столбцах PT1-PT4 нет записи для данного элемента (строки), то ничего не учитывается.

Поэтому в каждом столбчатом графике должно быть 12 палочек, соответствующих количеству каждого возможного результата.

Ниже приведена выдержка из моего набора данных.

Я новичок во всем этом, я не обязательно прошу прямого решения, но просто какое-то руководство о том, с чего начать, если это возможно.

Использование python 2.7, seaborn, панд и 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 amp; 190 (разделено на 5, поэтому 150, 155, 160…)), затем она считает 1 для этого и добавляет его к столбцу, соответствующему «сайту». Затем он перемещается в следующую строку и повторяется.

Однако, если значение не было найдено в TP4, то оно переходит в TP3, TP2 и т. Д., Пока что-то не будет найдено. Если он ничего не найдет во всех 4 столбцах, то ничего не будет подсчитано, и мы просто перейдем к следующей строке.

Я надеюсь, что это разъяснение может помочь.

Комментарии:

1. Просто из любопытства, есть ли причина, по которой вы используете Python 2.7?

2. Не очень хороший вариант, это просто ограничение, которое мне дали для этого. Я не имею права голоса в этом

Ответ №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();
 

введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь

Комментарии:

1. Спасибо, это помогает. Я получаю столбец «nan», который, похоже, подсчитывает все «нулевые» значения. Как я могу избавиться от этой колонки, поскольку она бесполезна? Кроме того, этот код, похоже, выводит график только для A3, может быть, это потому, что я на python 2.7?

2. Вы имеете в виду столбец » Нет » или пустой строковый столбец? plt.show(); в цикле разделите графики

3. В сюжете бара я получаю палочку под названием » нан » с очень высокой стоимостью, я хочу ее удалить. Я постараюсь разделить сюжеты в цикле, я не совсем уверен в том, как это делается.

4. вы используете функцию dropna (), поищите ее. или другой способ отбросить значения nan. и удалите их перед сюжетом.

5. flat_list = [x для x в flat_list, если x не np.nan ] вы можете добавить эту строку после обеих строк flat_list. это предполагает удаление nan (если nan является строкой, измените np.nan на «nan»).