2017-03-31 4 views
4

Angenommen, ich habe einen Datenrahmen:DataFrameGroupBy diff() unter der Bedingung

df = pd.DataFrame({'CATEGORY':['a','b','c','b','b','a','b'], 
        'VALUE':[pd.np.NaN,1,0,0,5,0,4]}) 

, die es wie

CATEGORY VALUE 
0  a   NaN 
1  b   1 
2  c   0 
3  b   0 
4  b   5 
5  a   0 
6  b   4 

I-Gruppe sieht:

df = df.groupby(by='CATEGORY') 

Und jetzt lassen Sie mich zeigen, was ich will mit Hilfe von Beispiel für eine Gruppe 'b':

df.get_group('b') 

Gruppe B:

CATEGORY VALUE 
1  b   1 
3  b   0 
4  b   5 
6  b   4 

Ich brauche: Im Rahmen jeder Gruppe zählen diff() zwischen VALUE Werte, Überspringen aller NaN0 s und s. So sollte das Ergebnis sein:

CATEGORY VALUE DIFF 
1  b   1  - 
3  b   0  - 
4  b   5  4 
6  b   4  -1 

Antwort

4

Sie könnenverwendenWerte subtrahieren nach dem Fallenlassen 0 und NaN Werte:

df = pd.DataFrame({'CATEGORY':['a','b','c','b','b','a','b'], 
       'VALUE':[pd.np.NaN,1,0,0,5,0,4]}) 

grouped = df.groupby("CATEGORY") 

# define diff func 
diff = lambda x: x["VALUE"].replace(0, np.NaN).dropna().diff() 
df["DIFF"] = grouped.apply(diff).reset_index(0, drop=True) 

print(df) 

    CATEGORY VALUE DIFF 
0  a NaN NaN 
1  b 1.0 NaN 
2  c 0.0 NaN 
3  b 0.0 NaN 
4  b 5.0 4.0 
5  a 0.0 NaN 
6  b 4.0 -1.0 
+0

Eigentlich diese nicht für Gruppen zu arbeiten. Der Fehler tritt auf, weil Sie das DataFrameGroupBy nicht "ersetzen" können. Ich habe es so umgeschrieben: '.apply (lambda x: np.NaN wenn x == 0)' aber das hat nicht geholfen; ( –

+0

@LadenkovVladislav Die Antwort für deine 'groupby' wurde aktualisiert. – pansen

+0

In python3 endet es mit' ' DataFrameGroupBy 'Objekt unterstützt keine Artikelzuweisung' –

1

wie ein Job-Sounds für einen pd.Series.shift() Betrieb zusammen mit einer notnull Maske.

Zuerst entfernen wir die unerwünschten Werte, bevor Gruppe wir die Daten

nonull_df = df[(df['VALUE'] != 0) & df['VALUE'].notnull()] 
groups = nonull_df.groupby(by='CATEGORY') 

Jetzt können wir intern in den Gruppen verschieben und die diff

nonull_df['next_value'] = groups['VALUE'].shift(1) 
nonull_df['diff'] = nonull_df['VALUE'] - nonull_df['next_value'] 

Schließlich berechnen und optional können Sie die Daten kopieren zurück zum ursprünglichen Datenrahmen

df.loc[nonull_df.index] = nonull_df 

df 
    CATEGORY VALUE next_value diff 
0  a NaN   NaN NaN 
1  b 1.0   NaN NaN 
2  c 0.0   NaN NaN 
3  b 0.0   1.0 -1.0 
4  b 5.0   1.0 4.0 
5  a 0.0   NaN NaN 
6  b 4.0   5.0 -1.0 
Verwandte Themen