2013-08-11 3 views
1

J'essaye d'avoir la moyenne d'une rangée dans mon DataFrame de Python, mais j'obtiens un retour de NaN pour chaque rangée. Pourquoi j'obtiens ce résultat et comment puis-je résoudre ce problème?NaN résultats avec la fonction moyenne de pandas

Goog ratios clés: http://www.gogofile.com/Default.aspx?p=sc&ID=635118193040317500_6234

path = 'GOOG Key Ratios.csv' 
#print(open(path).read()) 
data = pd.read_csv(path, skiprows = 2, names = ['Y0','Y1','Y2','Y3','Y4','Y5','Y6','Y7','Y8','Y9','Y10'], index_col = 0) 
noTTM = data.iloc[:,0:10] 
print(data.mean(1)) 
grossMargin = noTTM[2:3] 
print(grossMargin.mean(1)) 

Retour:

Gross Margin % NaN 
dtype: float64 

Cordialement,

+0

Si vous avez 'nan' dans votre sortie, alors cela signifie généralement il était seulement 'nan' dans l'entrée, modulo un bug. –

+0

Comment puis-je vérifier Si mon entrée est NaN? Parce que quand j'imprime le GrossMargin j'ai obtenu une valeur numérique .. – abuteau

+1

En appelant 'pandas.isnull' sur n'importe quel objet. Par exemple, vous pouvez appeler 'pandas.isnull (the_frame)'. –

Répondre

2

La raison pour laquelle vous avez un tas de valeurs nan est parce que vous n'avez pas la colonne homogène les types. Par exemple, lorsque vous essayez de faire la moyenne sur les colonnes, cela n'a aucun sens car pandas.read_csv ne convertira en une colonne numérique que si cela a du sens, par exemple, vous n'avez pas de date de chaîne ou d'autre texte dans la même colonne .

Je vous recommande également de faire un simple df.head() pour vérifier vos données avant même d'effectuer des analyses simples. Cela vous fera économiser beaucoup de temps dans le futur lorsque vous vous demanderez pourquoi votre production est "bizarre".

Cela dit, vous pouvez faire ce qui suit pour convertir des choses à des valeurs numériques, mais cela ne garantit pas nécessairement à donner un sens:

In [35]: df = read_csv('GOOG Key Ratios.csv', skiprows=2, index_col=0, names=['Y%d' % i for i in range(11)]) 

In [36]: df.head() # not homogeneously typed columns 
Out[36]: 
           Y0  Y1  Y2  Y3  Y4 \ 
NaN      2003-12 2004-12 2005-12 2006-12 2007-12 
Revenue USD Mil    1,466 3,189 6,139 10,605 16,594 
Gross Margin %    57.3  54.3  58.1  60.2  59.9 
Operating Income USD Mil  342  640 2,017 3,550 5,084 
Operating Margin %   23.4  20.1  32.9  33.5  30.6 

           Y5  Y6  Y7  Y8  Y9  Y10 
NaN      2008-12 2009-12 2010-12 2011-12 2012-12  TTM 
Revenue USD Mil   21,796 23,651 29,321 37,905 50,175 55,797 
Gross Margin %    60.4  62.6  64.5  65.2  58.9 56.7 
Operating Income USD Mil 6,632 8,312 10,381 11,742 12,760 12,734 
Operating Margin %   30.4  35.1  35.4  31.0  25.4 22.8 

In [37]: df.convert_objects(convert_numeric=True).head() 
Out[37]: 
          Y0  Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y10 
NaN       NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
Revenue USD Mil    NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
Gross Margin %    57.3 54.3 58.1 60.2 59.9 60.4 62.6 64.5 65.2 58.9 56.7 
Operating Income USD Mil 342.0 640.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 
Operating Margin %   23.4 20.1 32.9 33.5 30.6 30.4 35.1 35.4 31.0 25.4 22.8 
+0

Merci, je vais travailler autour de ça! – abuteau

+0

data.replace (',', '', regex = True) à remplacer, avec rien et facile à transformer en type float avec la méthode gentleman! – abuteau

+0

Heureux que vous aimez la méthode 'replace'! –

Questions connexes