2017-07-11 4 views
2

Ich versuche, die Anzahl der Änderungen von Wert in jeder Spalte in einem Datenrahmen in Pandas zählen. Der Code, den ich habe, funktioniert gut außer NaNs: Wenn eine Spalte zwei aufeinanderfolgende NaNs enthält, wird dies als Wertänderung gewertet, was ich nicht möchte. Wie kann ich das vermeiden?Zählen von Änderungen von Wert in jeder Spalte in einem Datenrahmen in Pandas ignorieren NaN-Änderungen

ich wie folgt (dank unutbu's answer):

import pandas as pd 
import numpy as np 

frame = pd.DataFrame({ 
    'time':[1234567000 , np.NaN, np.NaN], 
    'X1':[96.32,96.01,96.05], 
    'X2':[23.88,23.96,23.96] 
},columns=['time','X1','X2']) 

print(frame) 

changes = (frame.diff(axis=0) != 0).sum(axis=0) 
print(changes) 

changes = (frame != frame.shift(axis=0)).sum(axis=0) 
print(changes) 

kehrt:

  time  X1  X2 
0 1.234567e+09 96.32 23.88 
1   NaN 96.01 23.96 
2   NaN 96.05 23.96 

time 3 
X1  3 
X2  2 
dtype: int64 

time 3 
X1  3 
X2  2 
dtype: int64 

Stattdessen sollten die Ergebnisse sein (die Änderung in der Zeitspalte bemerken):

time 2 
X1  3 
X2  2 
dtype: int64 

Antwort

2
change = (frame.fillna(0).diff() != 0).sum() 

Ausgabe:

time 2 
X1  3 
X2  2 
dtype: int64 

NaN sind "truthy". Ändere NaN auf Null und bewerte dann.

nan - nan = nan 

nan != 0 = True 

fillna(0) 

0 - 0 = 0 

0 != 0 = False 
Verwandte Themen