2014-09-09 48 views
47

Tôi có DataFrame sau:Pandas: sum DataFrame hàng cho các cột cho

import pandas as pd 
df = pd.DataFrame({'a': [1,2,3], 'b': [2,3,4], 'c':['dd','ee','ff'], 'd':[5,9,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ẽ làm việc:

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

Nhưng không!

Tôi muốn thực hiện thao tác có danh sách các cột ['a','b','d']df làm đầu vào.

Trả lời

96

Bạn chỉ sum và có thể thiết lập param axis=1 để tổng hợp các hàng, điều này sẽ bỏ qua không cột số:

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ỉ cần tổng hợp các cột cụ thể sau đó bạn có thể tạo một danh sách các cột và loại bỏ những người bạn không quan tâm đến:

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 
+2

Tôi đã chỉnh sửa câu hỏi để có danh sách các tên được chỉ định :) Vì có thể có các cột có giá trị số tôi không muốn tính tổng! –

+0

@EdChum Làm thế nào điều này sẽ được thực hiện nếu tôi muốn tổng hợp các giá trị của một số hàng (tùy thuộc vào điều kiện) và cung cấp cho các hàng khác một giá trị tổng của 0? – Stanko

+0

@EdChum Có thể thay thế các giá trị tổng cột riêng lẻ, ví dụ: thay đổi inf thành 0 hoặc thay thế tổng cột hiện tại bằng một giá trị khác không? – toasteez

13

Nếu bạn có chỉ là 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 e vớ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 dài các cột, câu trả lời EdChum là ưa thích.

+3

hi, thks nhưng điều này không trả lời câu hỏi theo một cách mà nếu tôi có 20 tên cột, tôi chắc chắn sẽ không viết df.a + ... + df.t –

+0

(Rất, trả lời rất muộn - xin lỗi.) Đó là sự thật, bạn sử dụng phương pháp EdChum đề xuất cho các danh sách cột dài hơn. Điều đó nói rằng, viết 'df.a + df.b' là thuận tiện nếu bạn chỉ có một vài cột để tổng hợp và là cú pháp rõ ràng. –

+0

Có ai đó biết tương đương với các cột không phải là số không? – bowlby

0

Đây là một cách đơn giản bằng iloc để chọn cột để 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) 

Tạo:

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 thấy một cách để kết hợp một loạt và các cột cụ thể mà làm việc ví dụ cái gì đó như:

df['i']=df.iloc[:,[[0:2],3]].sum(axis=1) 
df['i']=df.iloc[:,[0:2,3]].sum(axis=1) 
Các vấn đề liên quan