Dapatkan total kolom Pandas


107

Target

Saya memiliki bingkai data Pandas, seperti yang ditunjukkan di bawah ini, dengan beberapa kolom dan ingin mendapatkan total kolom , MyColumn.


Bingkai Data -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   

Upaya saya :

Saya telah mencoba mendapatkan jumlah kolom menggunakan groupbydan .sum():

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

print Total

Ini menyebabkan kesalahan berikut:

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

Output yang Diharapkan

Saya mengharapkan hasilnya sebagai berikut:

319

Atau sebagai alternatif, saya ingin dfdiedit dengan rowjudul baru yang TOTALberisi 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
Untuk ilustrasi mengapa panda tidak pythonic, lihat kebingungan tentang cara menjumlahkan kolom.
pengguna1416227

Jawaban:


215

Anda harus menggunakan sum:

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

Kemudian Anda gunakan locdengan Series, dalam hal ini indeks harus disetel sama dengan kolom spesifik yang perlu Anda jumlahkan:

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

karena jika Anda melewatkan skalar, nilai semua baris akan terisi:

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

Dua solusi lainnya adalah dengan at, dan ixlihat aplikasi di bawah ini:

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

Catatan: Sejak Pandas v0.20, ixsudah tidak digunakan lagi. Gunakan locatau ilocsebagai gantinya.


Bagus sekali :) Terima kasih atas penjelasannya, boleh saya tanya apa .locdi contoh di atas?
LearningToJava


atberfungsi untuk pengaturan dengan pembesaran juga, lihat edit terakhir.
jezrael

Terima kasih, Apakah ada metode yang disukai?
LearningToJava

1
Hmmm, kata dokumen The .loc/.ix/[] operations can perform enlargement when setting a non-existant key for that axis., begitu locatau ixatau []. di bagian selanjutnya adalah menulis at may enlarge the object in-place as above if the indexer is missing.Jadi semua metode yang baik, tetapi atsaya pikir tercepat.
jezrael

22

Opsi lain yang dapat Anda gunakan di sini:

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

Anda juga bisa menggunakan append()metode:

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

masukkan deskripsi gambar di sini


Memperbarui:

Jika Anda perlu menambahkan jumlah untuk semua kolom numerik , Anda dapat melakukan salah satu hal berikut:

Gunakan appenduntuk melakukan ini secara fungsional (tidak mengubah bingkai data asli):

# 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

Gunakan locuntuk mengubah bingkai data di tempat:

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

Bagaimana dengan jumlah semua kolom?
FaCoffee

9

Mirip dengan mendapatkan panjang kerangka data, len(df)berikut ini bekerja untuk panda dan api:

Total = sum(df['MyColumn'])

atau sebagai alternatif

Total = sum(df.MyColumn)
print Total

2

Ada dua cara untuk menjumlahkan kolom

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

1: jumlah (dataset.Column_name)

2: kumpulan data ['Column_Name']. Sum ()

Jika ada masalah dalam hal ini tolong perbaiki saya ..


1

Sebagai opsi lain, Anda dapat melakukan sesuatu seperti di bawah ini

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

Script di bawah ini, Anda dapat menggunakan data di atas

import pandas as pd    
data = pd.read_csv("daata1.csv")
bytreatment = data.groupby('Group')
bytreatment['amount'].sum()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.