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

Joh*_*ker 9 python dataframe pandas

如何将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
Run Code Online (Sandbox Code Playgroud)

我有以下代码

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()
Run Code Online (Sandbox Code Playgroud)

编辑:

期望的输出将是以下 df.groupby('date').mean()返回:

             a         b         c
date                              
1     3.333333  6.333333  2.333333
Run Code Online (Sandbox Code Playgroud)

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

   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
Run Code Online (Sandbox Code Playgroud)

3no*_*vak 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
Run Code Online (Sandbox Code Playgroud)


piR*_*red 6

解决方案
使用join一个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
Run Code Online (Sandbox Code Playgroud)

我们可以将其限制为公正 ['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
Run Code Online (Sandbox Code Playgroud)

额外的功劳并
没有真正回答你的问题...但我觉得它很整洁!

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
Run Code Online (Sandbox Code Playgroud)


Gur*_*gde 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
Run Code Online (Sandbox Code Playgroud)