Groupby Pandas DataFrame并计算一列的mean和stdev,并使用reset_index将std添加为新列

kkh*_*i99 20 python pandas

我有一个Pandas DataFrame如下:

   a      b      c      d
0  Apple  3      5      7
1  Banana 4      4      8
2  Cherry 7      1      3
3  Apple  3      4      7
Run Code Online (Sandbox Code Playgroud)

我想按行'a'对行进行分组,同时将列'c'中的值替换为分组行中的值的平均值,并添加另一列,其中列'c'中的值的std偏差已经计算出其平均值.对于要分组的所有行,"b"或"d"列中的值是常量.所以,期望的输出将是:

   a      b      c      d      e
0  Apple  3      4.5    7      0.707107
1  Banana 4      4      8      0
2  Cherry 7      1      3      0
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最佳方法是什么?

unu*_*tbu 31

你可以使用一个groupby-agg操作:

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

然后重命名和重新排序列:

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

请注意,分组groupby-agg值的平均值和标准偏差与您发布的值不同.


Pandas默认计算样本std.要计算人口std:

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

产量

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