Cible
J'ai un Pandas _ cadre de données, comme indiqué ci-dessous, avec plusieurs colonnes et souhaite 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 groupby
et .sum()
:
_Total = df.groupby['MyColumn'].sum()
print Total
_
Cela provoque l'erreur suivante:
_TypeError: 'instancemethod' object has no attribute '__getitem__'
_
Résultat attendu
Je m'attendais à ce que le résultat soit comme suit:
_319
_
Ou bien, j'aimerais que df
soit édité avec un nouveau row
intitulé TOTAL
contenant 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
_
Vous devriez utiliser sum
:
Total = df['MyColumn'].sum()
print (Total)
319
Ensuite, vous utilisez loc
avec Series
. Dans ce cas, l'index doit être défini comme identique à la colonne spécifique à 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 scalar, les valeurs de toutes les lignes seront renseignées:
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 ix
voir 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, ix
est obsolète. Utilisez plutôt loc
ou iloc
.
Une autre option que vous pouvez aller avec 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 méthode append()
:
df.append(pd.DataFrame(df.MyColumn.sum(), index = ["Total"], columns=["MyColumn"]))
Mise à jour:
Si vous devez ajouter une somme pour toutes les colonnes numériques , vous pouvez procéder de l'une des manières suivantes:
Utilisez append
pour le faire de manière fonctionnelle (ne modifie pas le bloc 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 loc
pour transformer le cadre 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
Comme pour obtenir la longueur d'une image, len(df)
, les éléments suivants ont fonctionné pour pandas et blaze:
Total = sum(df['MyColumn'])
ou bien
Total = sum(df.MyColumn)
print Total