Obtenir le total de la colonne Pandas


107

Cible

J'ai une trame de données Pandas, comme indiqué ci - dessous, avec plusieurs colonnes et que vous souhaitez obtenir le total de la colonne, MyColumn.


Trame de données -df:

print df

           X           MyColumn  Y              Z   
0          A           84        13.0           69.0   
1          B           76         77.0          127.0   
2          C           28         69.0           16.0   
3          D           28         28.0           31.0   
4          E           19         20.0           85.0   
5          F           84        193.0           70.0   

Ma tentative :

J'ai essayé d'obtenir la somme de la colonne en utilisant groupbyet .sum():

Total = df.groupby['MyColumn'].sum()

print Total

Cela provoque l'erreur suivante:

TypeError: 'instancemethod' object has no attribute '__getitem__'

Production attendue

Je m'attendais à ce que la sortie soit comme suit:

319

Ou bien, je voudrais dfêtre édité avec un nouveau rowtitre TOTALcontenant le total:

           X           MyColumn  Y              Z   
0          A           84        13.0           69.0   
1          B           76         77.0          127.0   
2          C           28         69.0           16.0   
3          D           28         28.0           31.0   
4          E           19         20.0           85.0   
5          F           84        193.0           70.0   
TOTAL                  319

11
Pour une illustration de la raison pour laquelle les pandas ne sont pas pythoniques, ne cherchez pas plus loin que la confusion sur la façon de simplement additionner une colonne.
user1416227

Réponses:


215

Vous devez utiliser sum:

Total = df['MyColumn'].sum()
print (Total)
319

Ensuite, vous utilisez locavec Series, dans ce cas, l'index doit être défini comme la même colonne que vous devez additionner:

df.loc['Total'] = pd.Series(df['MyColumn'].sum(), index = ['MyColumn'])
print (df)
         X  MyColumn      Y      Z
0        A      84.0   13.0   69.0
1        B      76.0   77.0  127.0
2        C      28.0   69.0   16.0
3        D      28.0   28.0   31.0
4        E      19.0   20.0   85.0
5        F      84.0  193.0   70.0
Total  NaN     319.0    NaN    NaN

car si vous passez scalaire, les valeurs de toutes les lignes seront remplies:

df.loc['Total'] = df['MyColumn'].sum()
print (df)
         X  MyColumn      Y      Z
0        A        84   13.0   69.0
1        B        76   77.0  127.0
2        C        28   69.0   16.0
3        D        28   28.0   31.0
4        E        19   20.0   85.0
5        F        84  193.0   70.0
Total  319       319  319.0  319.0

Deux autres solutions sont avec at, et ixvoir les applications ci-dessous:

df.at['Total', 'MyColumn'] = df['MyColumn'].sum()
print (df)
         X  MyColumn      Y      Z
0        A      84.0   13.0   69.0
1        B      76.0   77.0  127.0
2        C      28.0   69.0   16.0
3        D      28.0   28.0   31.0
4        E      19.0   20.0   85.0
5        F      84.0  193.0   70.0
Total  NaN     319.0    NaN    NaN

df.ix['Total', 'MyColumn'] = df['MyColumn'].sum()
print (df)
         X  MyColumn      Y      Z
0        A      84.0   13.0   69.0
1        B      76.0   77.0  127.0
2        C      28.0   69.0   16.0
3        D      28.0   28.0   31.0
4        E      19.0   20.0   85.0
5        F      84.0  193.0   70.0
Total  NaN     319.0    NaN    NaN

Remarque: depuis Pandas v0.20, ixest obsolète. Utilisez locou à la ilocplace.


C'est super :) Merci pour l'explication, puis-je demander ce que .locfait l'exemple ci-dessus?
LearningToJava


atfonctionne également pour le réglage avec agrandissement, voir la dernière modification.
jezrael

Merci, y a-t-il une méthode préférée?
LearningToJava

1
Hmmm, dit la documentation The .loc/.ix/[] operations can perform enlargement when setting a non-existant key for that axis., oui locou ixou []. dans la section suivante est écrit at may enlarge the object in-place as above if the indexer is missing.Donc toutes les méthodes sont bonnes, mais atc'est le plus rapide je pense.
jezrael

22

Une autre option que vous pouvez utiliser ici:

df.loc["Total", "MyColumn"] = df.MyColumn.sum()

#         X  MyColumn      Y       Z
#0        A     84.0    13.0    69.0
#1        B     76.0    77.0   127.0
#2        C     28.0    69.0    16.0
#3        D     28.0    28.0    31.0
#4        E     19.0    20.0    85.0
#5        F     84.0   193.0    70.0
#Total  NaN    319.0     NaN     NaN

Vous pouvez également utiliser la append()méthode:

df.append(pd.DataFrame(df.MyColumn.sum(), index = ["Total"], columns=["MyColumn"]))

entrez la description de l'image ici


Mettre à jour:

Si vous devez ajouter une somme pour toutes les colonnes numériques , vous pouvez effectuer l'une des opérations suivantes:

Utilisez appendpour le faire de manière fonctionnelle (ne change pas la trame de données d'origine):

# select numeric columns and calculate the sums
sums = df.select_dtypes(pd.np.number).sum().rename('total')

# append sums to the data frame
df.append(sums)
#         X  MyColumn      Y      Z
#0        A      84.0   13.0   69.0
#1        B      76.0   77.0  127.0
#2        C      28.0   69.0   16.0
#3        D      28.0   28.0   31.0
#4        E      19.0   20.0   85.0
#5        F      84.0  193.0   70.0
#total  NaN     319.0  400.0  398.0

Utilisez locpour muter la trame de données en place:

df.loc['total'] = df.select_dtypes(pd.np.number).sum()
df
#         X  MyColumn      Y      Z
#0        A      84.0   13.0   69.0
#1        B      76.0   77.0  127.0
#2        C      28.0   69.0   16.0
#3        D      28.0   28.0   31.0
#4        E      19.0   20.0   85.0
#5        F      84.0  193.0   70.0
#total  NaN     638.0  800.0  796.0

Qu'en est-il de la somme de toutes les colonnes?
FaCoffee

9

Semblable à l'obtention de la longueur d'une dataframe len(df), les éléments suivants ont fonctionné pour les pandas et les flammes:

Total = sum(df['MyColumn'])

Ou bien

Total = sum(df.MyColumn)
print Total

2

Il existe deux façons de faire la somme d'une colonne

dataset = pd.read_csv ("data.csv")

1: somme (ensemble de données. Nom_colonne)

2: ensemble de données ['Column_Name']. Sum ()

S'il y a un problème, veuillez me corriger.


1

Comme autre option, vous pouvez faire quelque chose comme ci-dessous

Group   Valuation   amount
    0   BKB Tube    156
    1   BKB Tube    143
    2   BKB Tube    67
    3   BAC Tube    176
    4   BAC Tube    39
    5   JDK Tube    75
    6   JDK Tube    35
    7   JDK Tube    155
    8   ETH Tube    38
    9   ETH Tube    56

Sous le script, vous pouvez utiliser pour les données ci-dessus

import pandas as pd    
data = pd.read_csv("daata1.csv")
bytreatment = data.groupby('Group')
bytreatment['amount'].sum()
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.