2017-07-07 2 views
2

Étant donné un fichier comme ceci:Crosstab dataframe avec datetime réchantillonné de fichier de table

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 

J'utilise pandas géants pour construire une trame de données:

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

A partir de ce que j'essaie d'utiliser des méthodes de pandas simples à Construire une matrice de tableau croisé comme:

 1 2 3 4 

2010 1 1 0 0 
2011 1 0 0 1 

Où les colonnes sont des catégories, les lignes sont des dates et les valeurs sont t Mon problème est que je ne sais pas comment classer les dates-dates par années ou par mois et ensuite construire la matrice de tableau croisé. Je l'ai vu sur stackoverflow que la fonction re-échantillonnage est la meilleure façon de bin datetimes et de construire un tableau croisé alors la matrice:

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

Est-il possible de combiner ces deux fonctions pour obtenir la matrice désirée? Ou suis-je totalement mal?

L'objectif à atteindre est d'utiliser cette matrice pour tracer un heatmap Seaborn ressemblant à: enter image description here

Répondre

3

Il semble que vous avez besoin de convertir date-year:

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 

Mais si besoin rééchantillonnage d'abord par mois :

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

Différence mieux voir si les données 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

travaillé très fin et facile à régler! Je m'interroge sur la ligne de rééchantillonnage (que j'ai commentée pour le moment). Pourquoi les catégories changent-elles alors que nous spécifions que nous voulons rééchantillonner les «dates»? – Vanpourix

+0

Hmmm, si resample par mois et besoin de dates, alors toutes les dates sont converties en dernière date du mois. C'est par conception chez les pandas. Peut-être que alo peut vérifier [docs] (http://pandas.pydata.org/pandas-docs/stable/timeseries.html#resampling) – jezrael

+0

Et les catégories sont changées, parce que groupées par mois et agrégées par somme - donc les catégories sont des nombres et sont additionnés. – jezrael

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

Entendue, cela voudrait dire que je ne doute pas besoin de rééchantillonner pour mon application. si je veux aller de ceci:

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

à ceci:

category 1 2 4 7 
date 
2011 4 2 2 2