web-dev-qa-db-fra.com

Pandas - Possible d'agréger deux colonnes en utilisant deux agrégations différentes?

Je charge un fichier CSV, qui possède les colonnes suivantes: date, texta, textb, numbera, numéros

Je veux regrouper par les colonnes: Date, Texta et Textb - mais je veux appliquer "somme" à Numbera, mais "min" à la noticeb.

data = pd.read_table("file.csv", sep=",", thousands=',')
grouped = data.groupby(["date", "textA", "textB"], as_index=False)

... Mais je ne peux pas voir comment appliquer ensuite deux fonctions agrégées différentes, à deux colonnes différentes? C'est à dire. sum(numberA), min(numberB)

26
marcus adamski

La méthode agg peut accepter un dict, auquel cas les touches indiquent la colonne à laquelle la fonction est appliquée:

grouped.agg({'numberA':'sum', 'numberB':'min'})

Par exemple,

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'],
                   'number A': np.arange(8),
                   'number B': np.arange(8) * 2})
grouped = df.groupby('A')

print(grouped.agg({
    'number A': 'sum',
    'number B': 'min'}))

rendements

     number B  number A
A                      
bar         2         9
foo         0        19

Cela montre également que Pandas peut gérer des espaces dans les noms de colonne. Je ne suis pas sûr de l'origine du problème, mais les espaces littéraux n'auraient pas dû poser un problème. Si vous souhaitez enquêter sur cette plus loin,

print(df.columns)

sans réaffecter les noms de colonne, montrera-nous montrer le repr des noms. Peut-être qu'il y avait un caractère difficile à voir dans le nom de la colonne ressemblant à un espace (ou d'un autre caractère) mais était en fait un u'\xa0' (Espace sans pause), par exemple.

34
unutbu