2017-10-19 17 views
0

Avec l'échantillon, la cible est:récapitulant pandas géants multiindice dataframe

Calculer les funtions dans chaque valeur de 'A', en d'autres termes, calculer quelque chose dans toutes les valeurs des variables dans toutes B valeurs dans chaque étiquette A .:

import numpy as np 
import pandas as pd 

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 
           'foo', 'bar', 'foo', 'foo'], 
         'B' : ['one', 'one', 'two', 'three', 
           'two', 'two', 'one', 'three'], 
         'C' : np.random.randn(8), 
         'D' : np.random.randn(8)}) 

def var1(x): return max(x)-min(x) 
def var2(x): return (max(x)-min(x))/max(x) 
def var3(x): return (max(x)-min(x))/ len(x) 

df = df.groupby(['A','B']).agg({'C': var1, 'D': [var2, var3]}) 

output

cible

La sortie se présente comme suit:

A   var1  var2  var3   
bar   0.000000 -0.000000 0.000000 
foo   1,008986 -0.8572265 0.3015905 

fonctions comme:

def var1(x): return max(x)-min(x) 
def var2(x): return (max(x)-min(x))/max(x) 
def var3(x): return (max(x)-min(x))/ len(x) 
def mean(numbers): 
    return float(sum(numbers))/max(len(numbers), 1) 

Répondre

1

IIUC:

In [8]: df 
Out[8]: 
        C   D 
       var1  var2  var3 
A B 
bar one 0.000000 0.000000 0.000000 
    three 0.000000 -0.000000 0.000000 
    two 0.000000 -0.000000 0.000000 
foo one 1.585287 0.663121 0.101220 
    three 0.000000 -0.000000 0.000000 
    two 0.799511 -0.074874 0.032681 

In [9]: df.mean(level='A') 
Out[9]: 
      C   D 
     var1  var2  var3 
A 
bar 0.000000 0.000000 0.000000 
foo 0.794933 0.196082 0.044634 

ou en utilisant la fonction personnalisée:

In [12]: def f(col): 
    ...:  return np.mean(col) ** 2 
    ...: 

In [13]: df.groupby(level='A').apply(f) 
Out[13]: 
      C   D 
     var1  var2  var3 
A 
bar 0.000000 0.000000 0.000000 
foo 0.631918 0.038448 0.001992 
+0

ok, vous l'avez, mais avec une fonction définie? – PeCaDe

+1

@PeCaDe, voir la mise à jour ... – MaxU