2017-06-08 1 views
1

Supposons que j'ai une série de données que je veux agréger par CatAgrégation de données en Python en utilisant plus d'une mesure d'une formule

Cat Volume Result 

A  45  4 
A  57  3 
B  56  3 
C  45  1 
C  55  2 

Je voudrais agréger la variance, Asymétrie et Kurtosis du volume et maximum de Résultat par cat. Je sais comment le faire un par un en calculant la variance, et Kurtosis de dissymétrie volume, mais je voudrais d'une manière ordonnée avec quelque chose comme ça

def f(row): 
    row['ResultM']=row['Result'].max() 
    row['Variance'] = pd.DataFrame(scipy.stats.moment(row['Volume'], moment=[2,3,4])) 
return 

TestData=OrgData.groupby('Id').apply(f) 

Mais cela ne fonctionne pas. Quelqu'un peut-il offrir des suggestions comment je peux corriger mon code? Merci

Répondre

0

Modifier

def f(x): 
    df = pd.DataFrame(scipy.stats.moment(x.Volume.astype(int),moment=[2,3,4]),index=['var','skew','kurtosis']).T 
    df['result_max'] = x.Result.astype(int).max() 
    return df 

df.groupby('Cat').apply(f) 

Essayons:

from scipy import stats 

OrgData.groupby('Cat').agg({'Result':'max','Volume':[stats.skew,np.var,stats.kurtosis]}) 

Sortie:

Result Volume    
     max skew var kurtosis 
Cat        
A  4  0 72.0  -2 
B  3  0 NaN  -3 
C  2  0 50.0  -2 
+0

Merci. Je sais que cela fonctionnerait mais j'espérais utiliser cette fonction scipy.stats.moment (row ['Volume'], moment = [2,3,4])) afin que je puisse capturer tous les moments sans avoir à clé dans un par un comme je dois le faire pour beaucoup de variables – user44137

+0

@ user44137 Bon, j'ai modifié le code pour regarder utiliser stats.moment. Vous étiez vraiment proche de votre code original. –

+0

Merci, mais les données sont en forme longue quand je le veux en forme large. J'ai essayé ceci mais cela ne fonctionne pas def f (x): df = pd.DataFrame (np.transpose (scipy.stats.moment (x.Volume, moment = [2,3,4])), columns = ['var', 'skew', 'kurtosis']) #df ['Result'] = x.Result.max() return df – user44137