2017-06-14 76 views
2

我想繪製{a,b}對的年度使用線圖。如何繪製使用熊貓的年度數據集?

X軸應該是年,y軸應該是使用。

這是我的數據集。如果在對沒有重複a, b VS year

a b  year usage 
a2 10104 2011 7.292787 
a0 10104 2012 43.545533 
b0 12011 2009 96.130359 
b1 12011 2009 7.658487 
b1 14102 2010 6.975572 

回答

3

使用pivot_table重新排列數據,使得我有在列ab和在索引year組合。

但是,一旦我們調整了可能會丟失數據。通過將interpolateindex參數一起使用,我們使用內插值填充缺失數據,同時保持與索引值的相對變化成比例。這在索引值不是統一分開時很重要,例如[2005, 2006, 2008]。如果索引統一分開,那麼使用index不會造成傷害,因爲它與默認值相同。

d1 = df.pivot_table('usage', 'year', ['a', 'b']).interpolate('index') 
d1.index = pd.PeriodIndex(d1.index, freq='A') 
d1.plot() 

enter image description here


迴應@ jezrael的評論

是有益的觀察什麼數據看起來不interpolate

d1 = df.pivot_table('usage', 'year', ['a', 'b']) 
d1.index = pd.PeriodIndex(d1.index, freq='A') 
d1 

a   a0  a2   b0  b1   
b   10104  10104  12011  12011  14102 
year              
2009  NaN  NaN 96.130359 7.658487  NaN 
2010  NaN  NaN  NaN  NaN 6.975572 
2011  NaN 7.292787  NaN  NaN  NaN 
2012 43.545533  NaN  NaN  NaN  NaN 

在這種情況下,我們不要」看看會發生什麼。但是我想到有更多的數據可以在稀疏數據之間看到NaN的差距。而不是向前填充,我們可以按比例填充。

d1 = df.pivot_table('usage', 'year', ['a', 'b']).interpolate('index') 
d1.index = pd.PeriodIndex(d1.index, freq='A') 
d1 

a   a0  a2   b0  b1   
b   10104  10104  12011  12011  14102 
year              
2009  NaN  NaN 96.130359 7.658487  NaN 
2010  NaN  NaN 96.130359 7.658487 6.975572 
2011  NaN 7.292787 96.130359 7.658487 6.975572 
2012 43.545533 7.292787 96.130359 7.658487 6.975572 

現在再說一遍,這將只顯示更多數據的好處。就這些數據而言,我們只能觀察到有限的前向加註。


關於mean
請注意,我用pivot_table和東西pivot_table手柄之一是,如果有是index/column規範內重複。它將聚合所有與aggfunc單元格相關的值。默認情況下,該功能是mean。但是,在這種情況下,根據已提交的數據,沒有重複的組合。因此,沒有發生聚合。

+0

太棒了!但我的x軸(年)顯示「0.0 0.5 1.0 ... + 2.009e3」。我如何將其更改爲顯示年份? – planaria

+0

@planaria我已更新我的帖子。 – piRSquared

+0

謝謝。你保存我的數據! – planaria

1

使用:

s = df.set_index(['year','a','b'])['usage'] 
     .unstack([1,2]) 
     .sort_‌​index(axis=1) 
     .interpolate('index') 
s.index = s.index.astype(str) 
s.plot() 
+0

但是,有很多{a,b}對。我不應該申請groupby或什麼? – planaria

+0

是的,當然,但是你需要計算一對年數嗎?像'df.groupby('year')['a','b']。size()。plot()'? – jezrael