2017-10-03 1 views
0

J'ai un dataframe panda de type objet.Python: np.nanpercentile, quel type de données mon dataframe doit-il avoir?

df.dtypes 

Out: 
data  object 
stimulus object 
trial  object 
dtype: object 

df.head() 

Out: 
    data stimulus trial 
0 2  -2   1 
1 2  -2   2 
2 2  -2   3 
3 2  -2   4 
4 2  -2   5 

Je souhaite obtenir un centile spécifique de mon ensemble de données. Quand j'utilise ce code, j'obtiens NaN dans ma sortie, probablement parce que j'ai NaN dans mon ensemble de données lui-même, que python interprète comme infini, donc il aura des problèmes lors du calcul des percentiles supérieurs.

df.groupby('stimulus').data.apply(lambda x: np.percentile(x, q=66)) 

Out: 
stimulus 
-2.00  2.0 
-1.75  2.9 
-1.00  1.0 
-0.75  1.0 
-0.50  0.0 
0.50  7.8 
1.00  9.9 
1.25 11.9 
1.75 13.9 
2.50  NaN 

je l'ai déjà découvert que je aurais besoin d'utiliser np.nanpercentile() au lieu, mais quand je l'utilise np.nanpercentile() à la place je reçois cette erreur. J'ai lu ailleurs que np.nanpercentile() vérifie le format de données du tableau d'entrée et se plaint si cela ne correspond pas. Savez-vous comment et à quel format j'ai besoin de changer mes données?

df.groupby('stimulus').data.apply(lambda x: np.nanpercentile(x, q=66)) 

Out: 
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe'' 
+0

Pouvez-vous convertir simplement les données à un tableau numpy puis appliquer np.nanpercentile à elle? Comme Arr = df.as_matrix (numéro_colonne) puis np.nanpercentile (Arr, 66) – jfish003

Répondre

0

Cela a fait le travail pour moi à la fin:

df = df.astype(float)