Pandas: tổng các hàng DataFrame cho các cột đã cho


153

Tôi có DataFrame sau:

In [1]:

import pandas as pd
df = pd.DataFrame({'a': [1,2,3], 'b': [2,3,4], 'c':['dd','ee','ff'], 'd':[5,9,1]})
df
Out [1]:
   a  b   c  d
0  1  2  dd  5
1  2  3  ee  9
2  3  4  ff  1

Tôi muốn thêm một cột 'e'mà là tổng của cột 'a', 'b''d'.

Đi khắp các diễn đàn, tôi nghĩ một cái gì đó như thế này sẽ hoạt động:

df['e'] = df[['a','b','d']].map(sum)

Nhưng nó đã không.

Tôi muốn biết hoạt động thích hợp với danh sách các cột ['a','b','d']dflàm đầu vào.

Câu trả lời:


260

Bạn có thể chỉ sumvà đặt param axis=1để tính tổng các hàng, điều này sẽ bỏ qua không có cột số nào:

In [91]:

df = pd.DataFrame({'a': [1,2,3], 'b': [2,3,4], 'c':['dd','ee','ff'], 'd':[5,9,1]})
df['e'] = df.sum(axis=1)
df
Out[91]:
   a  b   c  d   e
0  1  2  dd  5   8
1  2  3  ee  9  14
2  3  4  ff  1   8

Nếu bạn muốn chỉ tổng các cột cụ thể thì bạn có thể tạo danh sách các cột và xóa các cột bạn không quan tâm:

In [98]:

col_list= list(df)
col_list.remove('d')
col_list
Out[98]:
['a', 'b', 'c']
In [99]:

df['e'] = df[col_list].sum(axis=1)
df
Out[99]:
   a  b   c  d  e
0  1  2  dd  5  3
1  2  3  ee  9  5
2  3  4  ff  1  7

32

Nếu bạn chỉ có một vài cột để tổng hợp, bạn có thể viết:

df['e'] = df['a'] + df['b'] + df['d']

Điều này tạo ra cột mới evới các giá trị:

   a  b   c  d   e
0  1  2  dd  5   8
1  2  3  ee  9  14
2  3  4  ff  1   8

Đối với danh sách cột dài hơn, câu trả lời của EdChum được ưu tiên.


15

Tạo một danh sách các tên cột bạn muốn thêm.

df['total']=df.loc[:,list_name].sum(axis=1)

Nếu bạn muốn tổng cho các hàng nhất định, hãy chỉ định các hàng bằng cách sử dụng ':'


14

Đây là một cách đơn giản hơn bằng cách sử dụng iloc để chọn các cột cần tổng hợp:

df['f']=df.iloc[:,0:2].sum(axis=1)
df['g']=df.iloc[:,[0,1]].sum(axis=1)
df['h']=df.iloc[:,[0,3]].sum(axis=1)

Sản xuất:

   a  b   c  d   e  f  g   h
0  1  2  dd  5   8  3  3   6
1  2  3  ee  9  14  5  5  11
2  3  4  ff  1   8  7  7   4

Tôi không thể tìm cách kết hợp một phạm vi và các cột cụ thể hoạt động, ví dụ như:

df['i']=df.iloc[:,[[0:2],3]].sum(axis=1)
df['i']=df.iloc[:,[0:2,3]].sum(axis=1)

6

Cú pháp sau giúp tôi khi tôi có các cột theo thứ tự

awards_frame.values[:,1:4].sum(axis =1)

5

Bạn chỉ có thể chuyển khung dữ liệu của mình vào hàm sau :

def sum_frame_by_column(frame, new_col_name, list_of_cols_to_sum):
    frame[new_col_name] = frame[list_of_cols_to_sum].astype(float).sum(axis=1)
    return(frame)

Ví dụ :

Tôi có một khung dữ liệu (Awards_frame) như sau:

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

... và tôi muốn tạo một cột mới hiển thị tổng giải thưởng cho mỗi hàng :

Cách sử dụng :

Tôi chỉ đơn giản chuyển phần thưởng_frame của mình vào hàm, đồng thời chỉ định tên của cột mới và danh sách các tên cột sẽ được tóm tắt:

sum_frame_by_column(awards_frame, 'award_sum', ['award_1','award_2','award_3'])

Kết quả :

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


0

Cách ngắn nhất và đơn giản nhất ở đây là sử dụng

    df.eval('e = a + b + d')
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.