2012-11-06 73 views
15

Với DataFrame dưới đây là một ví dụ,Pandas: Tạo cột tổng hợp trong DataFrame

In [83]: 
df = pd.DataFrame({'A':[1,1,2,2],'B':[1,2,1,2],'values':np.arange(10,30,5)}) 
df 
Out[83]: 
    A B values 
0 1 1  10 
1 1 2  15 
2 2 1  20 
3 2 2  25 

Điều gì sẽ là một cách đơn giản để tạo ra một cột mới có chứa một số tập hợp các dữ liệu qua một trong các cột?

Ví dụ, nếu tôi tổng hợp values qua mục trong A

In [84]: 
df.groupby('A').sum()['values'] 
Out[84]: 
A 
1 25 
2 45 
Name: values 

Làm thế nào tôi có thể nhận được

A B values sum_values_A 
0 1 1  10   25 
1 1 2  15   25 
2 2 1  20   45 
3 2 2  25   45 

Trả lời

20
In [20]: df = pd.DataFrame({'A':[1,1,2,2],'B':[1,2,1,2],'values':np.arange(10,30,5)}) 

In [21]: df 
Out[21]: 
    A B values 
0 1 1  10 
1 1 2  15 
2 2 1  20 
3 2 2  25 

In [22]: df['sum_values_A'] = df.groupby('A')['values'].transform(np.sum) 

In [23]: df 
Out[23]: 
    A B values sum_values_A 
0 1 1  10   25 
1 1 2  15   25 
2 2 1  20   45 
3 2 2  25   45 
+0

Tuyệt vời! Tôi biết phải có một lớp lót. Cảm ơn. – foglerit

3

Tôi tìm thấy một cách sử dụng join:

In [101]: 
aggregated = df.groupby('A').sum()['values'] 
aggregated.name = 'sum_values_A' 
df.join(aggregated,on='A') 

Out[101]: 
    A B values sum_values_A 
0 1 1  10   25 
1 1 2  15   25 
2 2 1  20   45 
3 2 2  25   45 

Bất cứ ai cũng có một cách đơn giản hơn để làm điều đó?

3

này không phải là quá trực tiếp nhưng tôi thấy nó rất trực quan (việc sử dụng bản đồ để tạo cột mới từ cột khác) và có thể được áp dụng cho nhiều trường hợp khác:

gb = df.groupby('A').sum()['values'] 

def getvalue(x): 
    return gb[x] 

df['sum'] = df['A'].map(getvalue) 
df 
+0

Cảm ơn , phương pháp bản đồ có vẻ khá mạnh mẽ. Chắc chắn sẽ sử dụng nó thường xuyên. – foglerit

2
In [15]: def sum_col(df, col, new_col): 
    ....:  df[new_col] = df[col].sum() 
    ....:  return df 

In [16]: df.groupby("A").apply(sum_col, 'values', 'sum_values_A') 
Out[16]: 
    A B values sum_values_A 
0 1 1  10   25 
1 1 2  15   25 
2 2 1  20   45 
3 2 2  25   45 
Các vấn đề liên quan