2017-06-29 5 views
2

J'ai un zéros contenant la série, les pandas géants et np.nan:valeurs du groupe contaning np.nan à des intervalles

import pandas as pd 
import numpy as np 
df1 = pd.Series([ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, np.nan, np.nan, 1]) 
df1 
Out[6]: 
0  0.0 
1  0.0 
2  0.0 
3  0.0 
4  0.0 
5  1.0 
6  1.0 
7  1.0 
8  0.0 
9  0.0 
10 0.0 
11 NaN 
12 NaN 
13 1.0 
dtype: float64 

Je voudrais créer un DF2 de dataframe qui contient le début et la fin d'intervalles avec la même valeur, ainsi que la valeur associée ... DF2 dans ce cas devrait être ...

df2 
Out[5]: 
    Start  End Value 
0  0 4   0 
1  5 7   1 
2  8 10  0 
3  11 12  NaN 
4  13 13  1 

Suite à une solution here:

s = df1.ne(df1.shift()).cumsum() 
df2 = df1.groupby(s).apply(lambda x: pd.Series([x.index[0], x.index[-1], x.iat[0]], 
               index=['Start','End','Value'])) 
        .unstack().reset_index(drop=True) 

mais il ne fonctionne pas pour ce cas

df2 
Out[11]: 
    Start End Value 
0 0.0 4.0 0.0 
1 5.0 7.0 1.0 
2 8.0 10.0 0.0 
3 11.0 11.0 NaN 
4 12.0 12.0 NaN 
5 13.0 13.0 1.0 
+1

Si vous voulez connaître la raison pour laquelle les valeurs NaN ne comparent jamais égal, il est expliqué dans cette question. Ce n'est pas spécifique à python ou à numpy. https://stackoverflow.com/questions/1565164/what-is-the-rationale-for-all-comparisons-returning-false-for-ieee754-nan-values –

Répondre

1

NaNs ont problème avec vérification de l'égalité. Vous pourriez travailler, en le remplissant temporairement avec une valeur modeste.

In [361]: s = df1.fillna('-dummy-').ne(df1.fillna('-dummy-').shift()).cumsum() 

In [362]: df1.groupby(s).apply(lambda x: pd.Series([x.index[0], x.index[-1], x.iat[0]], 
    ...:           index=['Start','End','Value'])) 
    ...:   .unstack().reset_index(drop=True) 
Out[362]: 
    Start End Value 
0 0.0 4.0 0.0 
1 5.0 7.0 1.0 
2 8.0 10.0 0.0 
3 11.0 12.0 NaN 
4 13.0 13.0 1.0