2017-05-24 4 views
1

J'ai un dataframe de la structure suivante qui est simplifiée à cause de cette question:dataframe moyennes binned, sauter nan

Date  A B 
2016/1/1 nan nan 
2016/1/2 nan nan 
2016/1/3 3 2 
2016/1/4 4 1 
2016/1/5 nan nan 
2016/1/6 6 8 
2016/1/7 7 nan 
2016/1/8 8 3 
2016/1/9 9 5 

Ce que je veux faire est de créer une moyenne binned 3 jours, je peux facilement faire en utilisant

df = df.resample('3D', on='Date').mean() 

Cependant, l'utilisation de cette méthode les valeurs nan sont considérées comme des valeurs nulles et affectent la valeur moyenne comme ceci:

Date  A B 
2016/1/1 nan nan 
2016/1/2 nan nan 
2016/1/3 3 2 

Utilisation df.resample('3D', on='Date').mean() retours:

Date  A B 
2016/1/3 1 2/3 

Où que je souhaite obtenir:

Date  A B 
2016/1/3 3 2 

Lorsque la na valeurs sont ignorées pour le calcul.

Selon la documentation sur .mean() Je devrais être en mesure de skipna valeurs comme indiqué sur la page:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.mean.html#pandas.Series.mean

Cependant quand je lance ce qui suit:

df = df.resample('3D', on='Date').mean(skipna=True) 

Le le code suivant est renvoyé:

UnsupportedFunctionCall: numpy operations are not valid with resample. Use .resample(...).mean() instead 

Comment puis-je faire pour solv cette erreur et de produire les valeurs moyennes correctes que je désire?

+0

Je pense qu'il ya un problème, parce que pour 'df1 = df.resample ('3D', on = 'Date'). mean()' J'obtiens 'df1 = pd.DataFrame ({'A': [3.0, 5.0, 8.0], 'B': [2.0 , 4.5, 4.0]}, index = pd.to_datetime (['2016-01-01', '2016-01-04', '2016-01-07'])) ' – jezrael

+0

Donc toutes les valeurs de 'NaN 'sont exclues du nombre de moyennes. – jezrael

+0

Oui c'est correct, le compte de la moyenne est affecté par les valeurs NaN donc les exclure est ce que je cherche. 'Cumsum' et' cumcount' est quelque chose qui semble fonctionner mais je ne suis pas sûr de savoir comment l'implémenter sur la seule ligne avec resample. – cd123

Répondre

0

Vous devez:

#mean works perfectly 
df1 = df.resample('3D', on='Date').mean() 
print (df1) 
       A B 
Date     
2016-01-01 3.0 2.0 
2016-01-04 5.0 4.5 
2016-01-07 8.0 4.0 

Pour cumsum et cumcount avec omission des NaN de besoin transform, aussi cumcount est utilisé nombre trick 1 s:

df[['A1','B1']] = df.resample('3D', on='Date').transform('cumsum') 

df[['A2','B2']] = df[['A','B']].mask(df[['A','B']].notnull(), 1) 
df[['A2','B2']] = df.resample('3D', on='Date')[['A2','B2']].transform('cumsum') - 1 
print (df) 
     Date A B A1 B1 A2 B2 
0 2016-01-01 NaN NaN NaN NaN NaN NaN 
1 2016-01-02 NaN NaN NaN NaN NaN NaN 
2 2016-01-03 3.0 2.0 3.0 2.0 0.0 0.0 
3 2016-01-04 4.0 1.0 4.0 1.0 0.0 0.0 
4 2016-01-05 NaN NaN NaN NaN NaN NaN 
5 2016-01-06 6.0 8.0 10.0 9.0 1.0 1.0 
6 2016-01-07 7.0 NaN 7.0 NaN 0.0 NaN 
7 2016-01-08 8.0 3.0 15.0 3.0 1.0 0.0 
8 2016-01-09 9.0 5.0 24.0 8.0 2.0 1.0 
+0

Merci pour cela, après avoir lu votre réponse, j'ai coché quelque chose avec l'ensemble de données original que je lisais et les opérations de données ont été effectuées sur la mauvaise base de données. Cela a été corrigé, merci pour la perspicacité. – cd123

+0

Aucun problème, 'cumsum' et' cumcount' n'étaient pas faciles à mettre en place;) Bonne chance! – jezrael