#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»).