2017-03-26 18 views
9

Làm cách nào để thêm phương tiện b và c vào khung dữ liệu của tôi? Tôi đã thử một hợp nhất nhưng nó dường như không hoạt động. Vì vậy, tôi muốn thêm hai cột b_mean và c_mean thêm vào dataframe của tôi với kết quả của df.groupBy('date').mean()Python: Cách thêm các cột cụ thể của .mean vào dataframe

DataFrame

a b c date 
0 2 3 5  1 
1 5 9 1  1 
2 3 7 1  1 

Tôi có đoạn code sau

import pandas as pd 

a = [{'date': 1,'a':2, 'b':3, 'c':5}, {'date':1, 'a':5, 'b':9, 'c':1}, {'date':1, 'a':3, 'b':7, 'c':1}] 

df = pd.DataFrame(a) 

x = df.groupby('date').mean() 

Edit:

đầu ra mong muốn sẽ là df.groupby('date').mean() trả về sau:

   a   b   c 
date        
1  3.333333 6.333333 2.333333 

kết quả tôi mong muốn sẽ là khung dữ liệu sau

a b c date a_mean b_mean 
0 2 3 5  1 3.3333 6.3333 
1 5 9 1  1 3.3333 6.3333 
2 3 7 1  1 3.3333 6.3333 
+2

Bạn có thể muốn groupby.transform nhưng vui lòng thêm đầu ra mong muốn để nó rõ ràng hơn. – ayhan

Trả lời

3

Tôi giả định rằng bạn cần giá trị của một cột thêm vào như là một giá trị cột mới trong dataframe có ý nghĩa. Vui lòng sửa tôi bằng cách khác.

Bạn có thể đạt được bằng cách lấy giá trị trung bình của cột trực tiếp và tạo một cột mới bằng cách gán như

In [1]: import pandas as pd 

In [2]: a = [{'date': 1,'a':2, 'b':3, 'c':5}, {'date':1, 'a':5, 'b':9, 'c':1}, {'date':1, 'a':3, 'b':7, 'c':1}] 

In [3]: df = pd.DataFrame(a) 

In [4]: for col in ['b','c']: 
    ...:  df[col+"_mean"] = df.groupby('date')[col].transform('mean') 

In [5]: df 
Out[5]: 
    a b c date b_mean c_mean 
0 2 3 5  1 6.333333 2.333333 
1 5 9 1  1 6.333333 2.333333 
2 3 7 1  1 6.333333 2.333333 
+1

Việc lặp lại là tốt đẹp, nhưng OP cần một giải pháp có khả năng chứa nhóm. – 3novak

8

Như @ayhan đề cập, bạn có thể sử dụng pd.groupby.transform() cho việc này. Chuyển đổi giống như áp dụng, nhưng nó sử dụng chỉ mục giống như dataframe ban đầu thay vì các giá trị duy nhất trong cột được nhóm lại.

df['a_mean'] = df.groupby('date')['a'].transform('mean') 
df['b_mean'] = df.groupby('date')['b'].transform('mean') 

>>> df 
    a b c date b_mean a_mean 
0 2 3 5  1 6.333333 3.333333 
1 5 9 1  1 6.333333 3.333333 
2 3 7 1  1 6.333333 3.333333 
+0

Đây cũng là một giải pháp tuyệt vời. – piRSquared

6

giải pháp
Sử dụng join với một tham số rsuffix.

df.join(df.groupby('date').mean(), on='date', rsuffix='_mean') 

    a b c date a_mean b_mean c_mean 
0 2 3 5  1 3.333333 6.333333 2.333333 
1 5 9 1  1 3.333333 6.333333 2.333333 
2 3 7 1  1 3.333333 6.333333 2.333333 

Chúng ta có thể hạn chế nó để chỉ ['a', 'b']

df.join(df.groupby('date')[['a', 'b']].mean(), on='date', rsuffix='_mean') 

    a b c date a_mean b_mean 
0 2 3 5  1 3.333333 6.333333 
1 5 9 1  1 3.333333 6.333333 
2 3 7 1  1 3.333333 6.333333 

tín dụng thêm
Không thực sự trả lời câu hỏi của bạn ... nhưng tôi nghĩ rằng nó là gọn gàng!

d1 = df.set_index('date', append=True).swaplevel(0, 1) 
g = df.groupby('date').describe() 
d1.append(g).sort_index() 

        a   b   c 
date          
1 0  2.000000 3.000000 5.000000 
    1  5.000000 9.000000 1.000000 
    2  3.000000 7.000000 1.000000 
    25% 2.500000 5.000000 1.000000 
    50% 3.000000 7.000000 1.000000 
    75% 4.000000 8.000000 3.000000 
    count 3.000000 3.000000 3.000000 
    max 5.000000 9.000000 5.000000 
    mean 3.333333 6.333333 2.333333 
    min 2.000000 3.000000 1.000000 
    std 1.527525 3.055050 2.309401 
+0

Thật tuyệt vời! Đây là một giải pháp tuyệt vời. Thực hiện tốt. – 3novak

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