2017-03-26 15 views
9

Veritabanıma b ve c araçlarını nasıl ekleyebilirim? Birleştirme denedim ama işe yaramadı.Python: Veritabanına özel .mean sütunları nasıl eklenir?

İstenilen çıktı: Ben fazladan iki sütun b_mean ve df.groupBy('date').mean()

DataFrame

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

Aşağıdaki kodu var

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() 

Düzenleme sonuçları ile benim dataframe eklenen c_mean istiyorum aşağıdaki df.groupby('date').mean() olur:

   a   b   c 
date        
1  3.333333 6.333333 2.333333 

My istenen sonucu, aşağıdaki veri çerçevesini

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

Muhtemelen groupby.transform isteyebilirsiniz, ancak lütfen istediğiniz çıktıyı daha net olacak şekilde ekleyin. – ayhan

cevap

3

Sana dataframe yeni sütun değeri olarak ilave bir sütunun ortalama değer gerekir varsayarak olacaktır. Lütfen beni düzeltin.

Sen bunun için pd.groupby.transform() kullanabilirsiniz, bahsedilen @ayhan gibi

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

Yineleme güzeldir, ancak OP'nin gruplandırmayı barındıran bir çözüme ihtiyacı vardır. – 3novak

8

gibi doğrudan sütunun ortalamasını alarak elde etmek ve atayarak yeni bir sütun oluşturabilirsiniz. Dönüştürme geçerli gibidir, ancak gruplanmış sütun (lar) daki benzersiz değerler yerine özgün veri çerçevesiyle aynı dizini kullanır.

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

Bu da harika bir çözüm. – piRSquared

6

bir rsuffix parametreyle çözelti
kullanımı join.

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 

Biz sadece ['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 

ekstra kredi
gerçekten soruya cevap Değil sınırlayabilir ... ama temiz olduğunu düşündüm!

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

Vay! Bu harika bir çözüm. Güzel bitti. – 3novak

İlgili konular