我有一个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)