Python:如何将.mean的特定列添加到数据帧

时间:2017-03-26 22:01:19

标签: python pandas dataframe

如何将b和c的方法添加到我的数据框中?我试过合并,但它似乎没有用。所以我想在我的数据框中添加两个额外的列b_mean和c_mean,结果为df.groupBy('date').mean()

数据帧

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

我有以下代码

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

编辑:

所需的输出如下 df.groupby('date').mean()返回:

             a         b         c
date                              
1     3.333333  6.333333  2.333333

我想要的结果将是以下数据框

   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

3 个答案:

答案 0 :(得分:8)

正如@ayhan所提到的,你可以使用pd.groupby.transform()。变换类似于apply,但它使用与原始数据帧相同的索引,而不是分组的列中的唯一值。

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

答案 1 :(得分:6)

<强> 溶液
joinrsuffix参数一起使用。

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

我们可以将其限制为['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

额外信用
不是真的回答你的问题...但我觉得它很整洁!

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

答案 2 :(得分:3)

我假设您需要在数据框中添加作为新列值的列的平均值。请更正我。

您可以通过直接获取列的平均值并通过分配类似

创建新列来实现
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