2017-06-29 3 views
2

I eine pandas Serie enthält Nullen, Einsen und np.nan:Gruppenwerte contaning np.nan in Intervallen

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 

Ich mag einen Datenrahmen DF2 erzeugen, die den Anfang und das Ende von Intervallen enthalten, mit

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) 
: der gleiche Wert zusammen mit dem Wert, der ... df2 soll in diesem Fall ...

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 

Nach einer Lösung here sein 210

aber es funktioniert nicht für diesen Fall

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

Wenn Sie den Grund wissen wollen, warum NaN-Werte nie gleich vergleichen, wird es in dieser Frage erklärt. Dies ist nicht python oder numpy spezifisch. https://stackoverflow.com/questions/1565164/what-is-the-rationale-for-all-comparons-returning-false-for-ieee754-nan-values –

Antwort

1

NaNs Problem mit Gleichheitsprüfung haben. Du könntest damit umgehen und es vorübergehend mit einem unauffälligen Wert füllen.

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 
Verwandte Themen