2017-05-07 41 views
0

我有兩列,分類和年份,我試圖繪製。我試圖將每年的每個分類的總和作爲一個多級時間序列圖。如何隨着時間的推移按類別繪圖

ax = data[data.categorical=="cat1"]["categorical"].plot(label='cat1') 
data[data.categorical=="cat2"]["categorical"].plot(ax=ax, label='cat3') 
data[data.categorical=="cat3"]["categorical"].plot(ax=ax, label='cat3') 
plt.xlabel("Year") 
plt.ylabel("Number per category") 
sns.despine() 

但是,我得到一個錯誤,指出沒有數字數據繪圖。我正在尋找類似於上面的東西,可能與data[data.categorical=="cat3"]["categorical"].lambda x : (1 for x in data.categorical)

我將使用以下列表作爲示例。

categorical = ["cat1","cat1","cat2","cat3","cat2","cat1","cat3","cat2","cat1","cat3","cat3","cat3","cat2","cat1","cat2","cat3","cat2","cat2","cat3","cat1","cat1","cat1","cat3"] 

year = [2013,2014,2013,2015,2014,2014,2013,2014,2014,2015,2015,2013,2014,2014,2013,2014,2015,2015,2015,2013,2014,2015,2013] 

我的目標是獲得類似於下面的圖片 enter image description here

+1

您能提供完整的回溯錯誤和一些樣本數據嗎? – Chuck

+0

是的,抱歉。現在應該更清楚了。 – Min

+0

它沒有任何意義:'數據[data.categorical ==「CAT2」] [「絕對」]'是一系列字符串,只有'「CAT2」'作爲值。你不能策劃這一點。 – IanS

回答

0

您是否嘗試過GROUPBY的東西嗎?

df.groupby(["year","categorical"]).count() 
+0

是的,我做了較早,但plt.plot(df.groupby([「年」,「分類])。COUNT())返回'元組‘對象不是可調用的’ – Min

+0

,但你應該得到一個數據框,你可以工作。例如,在groupby之前添加df [「count」])df [「categorical」],而不是在groupby之後選擇cat1 over loc並嘗試打印那個 – Herka

1

我不願稱之爲「解決方案」,因爲它基本上是一個基本的熊貓功能,這是在哪裏找到您放置在時間序列圖相同的文檔中解釋彙總您帖子。但看到圍繞groupby出現一些混淆和繪圖,演示可能有助於清理事情。

我們可以使用兩個電話groupby()
使用count聚合,第一個groupby()可獲得每年類別出現次數。
第二個groupby()用於繪製每個類別的時間序列。

要啓動,產生的樣本數據幀:

import pandas as pd 
categorical = ["cat1","cat1","cat2","cat3","cat2","cat1","cat3","cat2", 
       "cat1","cat3","cat3","cat3","cat2","cat1","cat2","cat3", 
       "cat2","cat2","cat3","cat1","cat1","cat1","cat3"] 
year = [2013,2014,2013,2015,2014,2014,2013,2014,2014,2015,2015,2013, 
     2014,2014,2013,2014,2015,2015,2015,2013,2014,2015,2013] 
df = pd.DataFrame({'categorical':categorical, 
        'year':year}) 

    categorical year 
0  cat1 2013 
1  cat1 2014 
       ... 
21  cat1 2015 
22  cat3 2013 

每類現在得到計數,每年:

# reset_index() gives a column for counting, after groupby uses year and category 
ctdf = (df.reset_index() 
      .groupby(['year','categorical'], as_index=False) 
      .count() 
      # rename isn't strictly necessary here, it's just for readability 
      .rename(columns={'index':'ct'}) 
     ) 

    year categorical ct 
0 2013  cat1 2 
1 2013  cat2 2 
2 2013  cat3 3 
3 2014  cat1 5 
4 2014  cat2 3 
5 2014  cat3 1 
6 2015  cat1 1 
7 2015  cat2 2 
8 2015  cat3 4 

最後,對於每個類別,由色鍵情節的時間序列:

from matplotlib import pyplot as plt 
fig, ax = plt.subplots() 

# key gives the group name (i.e. category), data gives the actual values 
for key, data in ctdf.groupby('categorical'): 
    data.plot(x='year', y='ct', ax=ax, label=key) 

time series plot by category

相關問題