Nhận tổng số cột Gấu trúc


107

Mục tiêu

Tôi có một khung dữ liệu Pandas, như được hiển thị bên dưới, với nhiều cột và muốn lấy tổng số cột MyColumn,.


Khung dữ liệu -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   

Cố gắng của tôi :

Tôi đã cố gắng lấy tổng của cột bằng cách sử dụng groupby.sum():

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

print Total

Điều này gây ra lỗi sau:

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

Sản lượng mong đợi

Tôi đã mong đợi kết quả đầu ra như sau:

319

Hoặc cách khác, tôi muốn dfđược chỉnh sửa với một rowtên mới TOTALchứa tổng số:

           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
Để có một minh họa về lý do tại sao gấu trúc không phải là loài trăn, không cần tìm đâu xa hơn là sự nhầm lẫn về cách đơn giản tính tổng một cột.
user1416227

Câu trả lời:


214

Bạn nên sử dụng sum:

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

Sau đó, bạn sử dụng locvới Series, trong trường hợp đó chỉ mục phải được đặt giống như cột cụ thể mà bạn cần tính tổng:

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

bởi vì nếu bạn vượt qua vô hướng, giá trị của tất cả các hàng sẽ được lấp đầy:

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

Hai giải pháp khác là với at, và ixxem các ứng dụng bên dưới:

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

Lưu ý: Kể từ Pandas v0.20, ixđã không được dùng nữa. Sử dụng lochoặc ilocthay thế.


Thật tuyệt :) Cảm ơn bạn đã giải thích, tôi có thể hỏi những gì .loctrong ví dụ trên?
LearningToJava


atcũng hoạt động để cài đặt với phóng to, hãy xem chỉnh sửa cuối cùng.
jezrael

Cảm ơn, Có phương pháp nào ưa thích không?
LearningToJava

1
Hmmm, tài liệu nói The .loc/.ix/[] operations can perform enlargement when setting a non-existant key for that axis., như vậy lochoặc ixhoặc []. trong phần tiếp theo là viết at may enlarge the object in-place as above if the indexer is missing.Vì vậy, tất cả các phương pháp đều tốt, nhưng attôi nghĩ là nhanh nhất.
jezrael

22

Một tùy chọn khác bạn có thể sử dụng tại đây:

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

Bạn cũng có thể sử dụng append()phương pháp:

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

nhập mô tả hình ảnh ở đây


Cập nhật:

Trong trường hợp bạn cần thêm tổng cho tất cả các cột số , bạn có thể thực hiện một trong các thao tác sau:

Sử dụng appendđể thực hiện việc này theo cách chức năng (không thay đổi khung dữ liệu ban đầu):

# 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

Sử dụng locđể thay đổi khung dữ liệu tại chỗ:

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

Làm thế nào về tổng của tất cả các cột?
FaCoffee

9

Tương tự như cách lấy độ dài của khung dữ liệu len(df), cách sau phù hợp với gấu trúc và blaze:

Total = sum(df['MyColumn'])

Hay cách khác

Total = sum(df.MyColumn)
print Total

2

Có hai cách để tính tổng của một cột

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

1: sum (dataset.Column_name)

2: tập dữ liệu ['Column_Name']. Sum ()

Nếu có bất kỳ vấn đề trong này, xin vui lòng sửa chữa cho tôi ..


1

Như một tùy chọn khác, bạn có thể làm điều gì đó như bên dưới

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

Tập lệnh bên dưới, bạn có thể sử dụng cho dữ liệu trên

import pandas as pd    
data = pd.read_csv("daata1.csv")
bytreatment = data.groupby('Group')
bytreatment['amount'].sum()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.