2017-05-05 1 views
0

J'essaye de faire une agrégation sur mon dataframe. Le problème est que je dois agréger par plus de cent colonnes. En ce moment, je les ai tous typés comme çaPandas Python: agréger un grand sous-ensemble de colonnes sans les taper explicitement

df_grouped = df.groupby(['Column1'])['Column2','Column3','Column4','Column5'].sum() 

jusqu'à la dernière colonne. Très ennuyeux et difficile à maintenir, si des changements doivent être faits. Y a-t-il un moyen de se référer à ces colonnes sans les taper explicitement?

+0

Est-ce que vous voulez exclure toute colonne en plus Column1? – IanS

+0

Oui, il y a plus de colonnes dans la base de données que je ne souhaite ni regrouper, ni additionner. – Duudsrednaz

+0

N'oubliez pas d'accepter une de nos réponses si vous les avez trouvées utiles. –

Répondre

2

Voici une manière très simple si vous pouvez sélectionner les colonnes désirées avec une condition. J'utilise cette méthode de temps en temps mais pas pour> 100 colonnes donc je ne suis pas sûr des implications de performance.

Pour un échantillon df:

df 
    a b c bb 
0 1 4 4 4 
1 2 5 5 5 
2 7 87 87 87 
3 5 6 6 6 

En utilisant la compréhension de la liste:

df[[i for i in df.columns if 'b' in i]] 
    b bb 
0 4 4 
1 5 5 
2 87 87 
3 6 6 

Cela peut évidemment être utilisé avec quelque condition que vous aimez.

df_grouped = df.groupby(['Column1'][[i for i in df.columns if 'b' in i]].sum() 

En utilisant mon exemple super simple, un peu à côté de la performance du côté:

%timeit df[[i for i in df.columns if 'b' in i]] 
1000 loops, best of 3: 394 µs per loop 

%timeit df[df.columns.difference(['a','c'])] 
1000 loops, best of 3: 598 µs per loop 
5

Vous pouvez définir les colonnes par différence:

df_grouped = df.groupby(['Column1'])[ 
    df.columns.difference(columns_to_exclude + ['Column1']) 
].sum() 

Notez que la méthode difference utilise des ensembles, de sorte que l'ordre des colonnes est pas garantie.

+0

Merci, je ne savais pas que vous pouviez utiliser n'importe quelle fonction entre les crochets []. Malheureusement, je dois exclure presque autant que je dois inclure, mais je suppose que je peux aussi utiliser des références d'index entre les parenthèses? – Duudsrednaz

+0

Cela dépend de la façon dont vous définissez les colonnes à exclure, mais je suis sûr que l'interface est assez flexible (voir l'autre réponse par exemple). – IanS