2017-02-14 5 views
2

Wäre es möglich, DataFrame inplace mit groupby Anweisung mutieren?Inplace Transformation Pandas mit groupby

import pandas as pd 
dt = pd.DataFrame({ 
        "LETTER": ["a", "b", "c", "a", "b"], 
        "VALUE" : [10 , 12 , 13, 0, 15] 
        }) 
def __add_new_col(dt_): 
    dt_['NEW_COL'] = dt_['VALUE'] - dt_['VALUE'].mean() 
    return dt_ 
pass 


dt.groupby("LETTER").apply(__add_new_col) 
    LETTER VALUE NEW_COL 
0  a  10  5.0 
1  b  12  -1.5 
2  c  13  0.0 
3  a  0  -5.0 
4  b  15  1.5 


dt 
    LETTER VALUE 
0  a  10 
1  b  12 
2  c  13 
3  a  0 
4  b  15 

In R data.table es möglich ist, beispielsweise durch Verwendung von := Operator dt[, col := ... , by ='LETTER']

+1

Warum nicht 'df [ 'NEWCOL'] = dt.groupby ('Brief') [ 'VALUE '] .apply (Lambda x: x - x.mean()) '? – Zero

+0

@JohnGalt Gibt es eine Bestellgarantie? –

+0

Ja, Sie können es auch selbst validieren. – Zero

Antwort

1

ich glaube, Sie transform verwenden können, die Series gleiche Länge und gleichen Index wie df mit Subtrahiereinheit zurück:

print (dt.groupby("LETTER")['VALUE'].transform('mean')) 
0  5.0 
1 13.5 
2 13.0 
3  5.0 
4 13.5 
Name: VALUE, dtype: float64 

dt['NEW_COL'] = dt['VALUE'] - dt.groupby("LETTER")['VALUE'].transform('mean') 
print (dt) 
    LETTER VALUE NEW_COL 
0  a  10  5.0 
1  b  12  -1.5 
2  c  13  0.0 
3  a  0  -5.0 
4  b  15  1.5 
1

Ich bin mir ziemlich sicher, dass Sie den Datenrahmen während einer Gruppe nicht mutieren können. Sie können genau die gleiche Operation durchführen, indem Sie jeden Buchstaben mit seiner Bedeutung abbilden und dann die Operation ausführen.

df['NEW_COL'] = df['VALUE'] - df['LETTER'].map(dt.groupby("LETTER")['VALUE'].mean()).values 

Diese mit jeder möglichen Bestell Frage befassen werden, die ich nicht vertrauen würde Garantie sein, auch wenn getestet. Besser sicher als Entschuldigung :)

Auch ich verwende .values ​​ Accessor nach der Karte, weil ich nicht sicher bin, was der Index der "gemappten" Serie wird die gleiche der "VALUE" -Serie sein, was irgendwann mit NaN resultieren wird.