2014-10-28 71 views
9

Tôi có một Pandas DataFrame như sau:groupby Pandas DataFrame và tính toán trung bình và độ lệch chuẩn của một cột và thêm std như một cột mới với reset_index

a  b  c  d 
0 Apple 3  5  7 
1 Banana 4  4  8 
2 Cherry 7  1  3 
3 Apple 3  4  7 

Tôi muốn nhóm các hàng theo cột 'một 'trong khi thay thế các giá trị trong cột' c 'bằng giá trị trung bình của các hàng được nhóm và thêm một cột khác có độ lệch chuẩn của các giá trị trong cột' c 'có nghĩa là đã được tính toán. Các giá trị trong cột 'b' hoặc 'd' là hằng số cho tất cả các hàng được nhóm lại. Vì vậy, kết quả mong muốn sẽ là:

a  b  c  d  e 
0 Apple 3  5  7  0.707107 
1 Banana 4  4  8  0 
2 Cherry 7  1  3  0 

Cách tốt nhất để đạt được điều này là gì?

Trả lời

13

Bạn có thể sử dụng một groupby-agg operation:

In [38]: result = df.groupby(['a'], as_index=False).agg(
         {'c':['mean','std'],'b':'first', 'd':'first'}) 

và sau đó đổi tên và sắp xếp lại các cột:

In [39]: result.columns = ['a','c','e','b','d'] 

In [40]: result.reindex(columns=sorted(result.columns)) 
Out[40]: 
     a b c d   e 
0 Apple 3 4.5 7 0.707107 
1 Banana 4 4.0 8  NaN 
2 Cherry 7 1.0 3  NaN 

Lưu ý giá trị trung bình và độ lệch tiêu chuẩn của nhóm c giá trị khác với những gì bạn được đăng.


Pandas tính mẫu theo mặc định. Để tính toán std dân:

def pop_std(x): 
    return x.std(ddof=0) 

result = df.groupby(['a'], as_index=False).agg({'c':['mean',pop_std],'b':'first', 'd':'first'}) 

result.columns = ['a','c','e','b','d'] 
result.reindex(columns=sorted(result.columns)) 

sản lượng

 a b c d e 
0 Apple 3 4.5 7 0.5 
1 Banana 4 4.0 8 0.0 
2 Cherry 7 1.0 3 0.0 
+0

Cảm ơn bạn @unutbu! – kkhatri99

+0

@unutbu: bạn có vui lòng kiểm tra câu hỏi này http://stackoverflow.com/questions/26601001/calculate-std-manually-using-groupby-pandas-dataframe – user3378649

Các vấn đề liên quan