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'và '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']và 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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.