2017-01-13 2 views
1
 error Months Year 
0 15.198688  Jan 2011.0 
1 13.793969 Jan_Feb 2011.0 
2 15.171848 Jan_Mar 2011.0 
3 5.779007 Jan_Apr 2011.0 
4 1.615044 Jan_May 2011.0 
5 1.536096 Jan_Jun 2011.0 
6 1.159742 Jan_Jul 2011.0 
0 1.697396  Jan 2012.0 
1 5.149847 Jan_Feb 2012.0 
2 0.876639 Jan_Mar 2012.0 
3 1.865001 Jan_Apr 2012.0 
4 0.333077 Jan_May 2012.0 
5 2.056728 Jan_Jun 2012.0 
0 9.676028  Jan 2013.0 
1 3.919200 Jan_Feb 2013.0 
2 4.171534 Jan_Mar 2013.0 
3 2.318090 Jan_Apr 2013.0 
4 0.786901 Jan_May 2013.0 
5 0.936041 Jan_Jun 2013.0 
6 0.115029 Jan_Jul 2013.0 

Есть ли способ построить рамку данных pandas, чтобы график имел 3 строки (по одному на каждый из 3 уникальных лет). Ось Y имеет столбец «ошибка», а ось X показывает месяц. Легенда должна быть 3 года: 2011, 2012, 2013Планирование pandas dataframe с годами

Для оси X, если месяц - это «Jan_Feb», тогда метка должна просто сказать «Feb». если месяц «Jan», то лейбл должен сказать «Jan»

Я попытался df.plot(), но он строит все на одном участке

+0

Вы можете сделать это с помощью 'groupby'. См. Этот [предыдущий вопрос SO] (http://stackoverflow.com/questions/15465645/plotting-results-of-pandas-groupby) – Jakub

ответ

1

Вы можете сначала сделать некоторые очистки данных - отливать years к int и months до ordered categorical для правильной сортировки по месяцам, а затем изменить на pivot, при необходимости замените NaN на некоторую величину, например 0 по fillna:

df.Year = df.Year.astype(int) 
df.Months = df.Months.str[-3:].astype('category', 
             ordered=True, 
             categories=['Jan','Feb','Mar','Apr','May','Jun','Jul']) 

df = df.pivot(index='Months', columns='Year', values='error').fillna(0) 
print (df) 
Year   2011  2012  2013 
Months        
Jan  15.198688 1.697396 9.676028 
Feb  13.793969 5.149847 3.919200 
Mar  15.171848 0.876639 4.171534 
Apr  5.779007 1.865001 2.318090 
May  1.615044 0.333077 0.786901 
Jun  1.536096 2.056728 0.936041 
Jul  1.159742 0.000000 0.115029 

df.plot() 

graph

Другим возможным решением для правильного упорядочения reindex упорядоченных месяцами в list:

df.Year = df.Year.astype(int) 
df.Months = df.Months.str[-3:] 
df = df.pivot(index='Months', columns='Year', values='error') 
     .fillna(0) 
     .reindex(['Jan','Feb','Mar','Apr','May','Jun','Jul']) 

print (df) 
Year   2011  2012  2013 
Months        
Jan  15.198688 1.697396 9.676028 
Feb  13.793969 5.149847 3.919200 
Mar  15.171848 0.876639 4.171534 
Apr  5.779007 1.865001 2.318090 
May  1.615044 0.333077 0.786901 
Jun  1.536096 2.056728 0.936041 
Jul  1.159742 0.000000 0.115029 
0

принимая к сведению, что в этом наборе данных, месяцы могут быть определены из индекс, т.е. [0..6] ->[Jan..Jul], желаемый график должен быть произведен с помощью следующего кода:

plt = df.pivot(values='error', columns='Year').plot() 

Однако теперь тексты клещ х-оси являются числами. Мы можем исправить это, используя:

plt.set_xticklabels(['Jan','Feb','Mar','Apr','May','Jun','Jul']) 
Смежные вопросы