Utilisation groupby apply
et le retour d'une Série de renommer des colonnes
Utiliser le groupby apply
méthode pour effectuer une agrégation
- Renomme les colonnes
- Permet pour des espaces dans les noms
- Vous permet d'ordonner le retour de l'colonnes de la manière que vous choisissez
- Permet des interactions entre les colonnes
- Renvoie un seul indice de niveau et PAS un MultiIndex
Pour ce faire:
- créer une fonction personnalisée qui vous passent
apply
- Cette fonction personnalisée est transmis chaque groupe comme un DataFrame
- De retour d'une Série
- L'indice de la Série seront les nouvelles colonnes
Créer de fausses données
df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1", "user3"],
"Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0, 9],
'Score': [9, 1, 8, 7, 7, 6, 9]})
créer une fonction qui retourne une Série
La variable x
à l'intérieur de l' my_agg
est un DataFrame
def my_agg(x):
names = {
'Amount mean': x['Amount'].mean(),
'Amount std': x['Amount'].std(),
'Amount range': x['Amount'].max() - x['Amount'].min(),
'Score Max': x['Score'].max(),
'Score Sum': x['Score'].sum(),
'Amount Score Sum': (x['Amount'] * x['Score']).sum()}
return pd.Series(names, index=['Amount range', 'Amount std', 'Amount mean',
'Score Sum', 'Score Max', 'Amount Score Sum'])
Pass cette fonction personnalisée à l'égard du groupe - apply
méthode
df.groupby('User').apply(my_agg)
Le gros inconvénient, c'est que cette fonction sera beaucoup plus lent que l' agg
pour les agrégations cythonized
À l'aide d'un dictionnaire avec groupby agg
méthode
À l'aide d'un dictionnaire de dictionnaires a été retiré en raison de sa complexité et quelque peu ambiguë. Il y a un débat en cours sur la façon d'améliorer cette fonctionnalité dans le futur sur github Ici, vous pouvez directement accéder à l'agrégation de colonne après l'égard du groupe d'appel. Tout simplement passer à une liste de tous les agréger les fonctions que vous souhaitez appliquer.
df.groupby('User')['Amount'].agg(['sum', 'count'])
Sortie
sum count
User
user1 18.0 2
user2 20.5 3
user3 10.5 1
Il est toujours possible d'utiliser un dictionnaire explicitement désigner les différentes agrégations dans les différentes colonnes, comme ici, si il y avait une autre colonne numérique nommée Other
.
df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1"],
"Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0],
'Other': [1,2,3,4,5,6]})
df.groupby('User').agg({'Amount' : ['sum', 'count'], 'Other':['max', 'std']})
Sortie
Amount Other
sum count max std
User
user1 18.0 2 6 3.535534
user2 20.5 3 5 1.527525
user3 10.5 1 4 NaN