2016-05-11 7 views
-2

Ich verarbeite einen Datenrahmen, der eine Spalte enthält, die eine Fehleranzahl enthält. Das Problem, das ich habe, ist der Zähler rollt nach 64k. Bei langen Läufen tritt der Rollover außerdem mehrmals auf. Ich brauche eine Methode, um diese Überläufe zu korrigieren und eine genaue Anzahl zu erhalten.Handhabung Wert Rollover in Datenrahmen

Antwort

0

Ich bin nicht sicher, dass es richtig immer, aber lassen Sie uns versuchen:

# groups 
g = df.groupby((df['count'].diff() < 0).cumsum()) 

# mapping cumulative summand 
mp = df.groupby((df['count'].diff() < 0).cumsum(), as_index=False).max().shift(1).fillna(0)['count'] 

# math 
for grp, chunk in g: 
    df['count'] += (df['count'].diff() < 0).cumsum().map(mp) 

Original-DF:

In [416]: df 
Out[416]: 
    count 
0  0 
1  1 
2  2 
3  3 
4  4 
5  5 
6  0 
7  1 
8  2 
9  3 
10  4 
11  0 
12  1 
13  2 
14  3 
15  4 
16  5 
17  6 
18  7 
19  8 

Ergebnis:

In [414]: df 
Out[414]: 
    count 
0  0.0 
1  1.0 
2  2.0 
3  3.0 
4  4.0 
5  5.0 
6  5.0 
7  6.0 
8  7.0 
9  8.0 
10 9.0 
11 9.0 
12 10.0 
13 11.0 
14 12.0 
15 13.0 
16 14.0 
17 15.0 
18 16.0 
19 17.0 

Erläuterung:

Helfer zum Gruppieren (Monoton steigende Gruppen):

In [418]: (df['count'].diff() < 0).cumsum() 
Out[418]: 
0  0 
1  0 
2  0 
3  0 
4  0 
5  0 
6  1 
7  1 
8  1 
9  1 
10 1 
11 2 
12 2 
13 2 
14 2 
15 2 
16 2 
17 2 
18 2 
19 2 
Name: count, dtype: int32 

Summand für jede Gruppe:

In [420]: df.groupby((df['count'].diff() < 0).cumsum(), as_index=False).max().shift(1).fillna(0)['count'] 
Out[420]: 
0 0.0 
1 5.0 
2 4.0 
Name: count, dtype: float64 

bereits abgebildet Summanden - sie werden N mal hinzugefügt werden (wo N ist die Anzahl der Gruppen - 3 für dieses Beispiel):

In [421]: (df['count'].diff() < 0).cumsum().map(mp) 
Out[421]: 
0  0.0 
1  0.0 
2  0.0 
3  0.0 
4  0.0 
5  0.0 
6  5.0 
7  5.0 
8  5.0 
9  5.0 
10 5.0 
11 4.0 
12 4.0 
13 4.0 
14 4.0 
15 4.0 
16 4.0 
17 4.0 
18 4.0 
19 4.0 
Name: count, dtype: float64 

Setup-Test DF:

df = pd.DataFrame({'count': np.arange(20)}) 
df.ix[6:10, 'count'] = range(5) 
df.ix[11:19, 'count'] = range(9)