2017-07-07 45 views
2

給定一個文件是這樣的:交叉表數據幀從表文件重採樣日期時間

date uselessinfo category uselessinfo2 
2011-07-22 02:56:36 banana 1 apple 
2011-02-27 17:15:44 banana 4 apple 
2010-12-12 00:13:42 banana 1 apple 
2010-10-12 00:13:00 banana 2 apple 

我使用的大熊貓建立一個數據幀:

data = pd.read_table(pathToFile, "\t") 

從這個我儘量用簡單大熊貓方法建立一個交叉表矩陣,如:

 1 2 3 4 

2010 1 1 0 0 
2011 1 0 0 1 

其中,列是類別,行是日期分箱,值是t他在這些箱子發生的類別

我的問題是,我不知道如何將日期時間或年或月,然後建立交叉表矩陣。 我看到的計算器的重採樣功能是倉日期時間和交叉的最佳方法,然後建立矩陣:

data = data.resample('M', on='date').sum() 
data = pd.crosstab(data.date,data.category) 

有沒有辦法來這兩個功能結合起來,以獲得所需的矩陣?還是我完全做錯了?

要達到的目標是利用這個矩陣來繪製seaborn熱圖看起來像: enter image description here

回答

3

看來你需要轉換dateyear

data = pd.read_table(pathToFile, "\t", parse_dates=['date']) 

data = pd.crosstab(data.date.dt.year ,data.category) 

print (data) 
category 1 2 4 
date    
2010  1 1 0 
2011  1 0 1 

但如果需要先重新採樣,持續數月:

data = data.resample('M', on='date').sum().reset_index() 
data = pd.crosstab(data.date.dt.year,data.category) 

差異最好看到,如果chagned數據:

print (data) 
       date uselessinfo category uselessinfo2 
0 2011-07-22 02:56:36  banana   1  apple 
1 2011-07-27 02:56:36  banana   7  apple 
2 2011-08-27 17:15:44  banana   4  apple 
3 2011-09-12 00:13:42  banana   1  apple 
4 2011-09-12 00:13:00  banana   2  apple 


data = data.resample('M', on='date').sum().reset_index() 
data = pd.crosstab(data.date.dt.year,data.category) 
print (data) 
category 3 4 8 
date    
2011  1 1 1 

data = pd.crosstab(data.date.dt.year,data.category) 
print (data) 
category 1 2 4 7 
date     
2011  2 1 1 1 
+0

工作真的很好,容易調教! 我只是想知道重採樣線(我現在評論)。爲什麼類別正在改變,而我們指定我們想對'日期'重新抽樣? – Vanpourix

+0

嗯,如果按月重新採樣並需要日期,那麼所有日期都將轉換爲月份的最後一個日期。這是在熊貓設計。也許alo可以檢查[docs](http://pandas.pydata.org/pandas-docs/stable/timeseries.html#resampling) – jezrael

+0

而且ategories也會發生變化,因爲它按月計算並按總和彙總 - 所以類別是數字並加以總結。 – jezrael

0
data = pd.crosstab(data.date.dt.year,data.category) 
print (data) 
category 1 2 4 7 
date     
2011  2 1 1 1 

理解,將意味着我可能不需要重新取樣我的應用程序。 如果我想從這個去什麼:

category 1 2 4 7 
date 
2011-05 2 1 1 1 
2011-06 2 1 1 1 

這樣:

category 1 2 4 7 
date 
2011 4 2 2 2