如何用Pandas创建含另一DataFrame行均值与标准差的新DataFrame
解决方法:用groupby+agg实现多统计量聚合
嘿,这个需求在pandas里其实很容易实现,核心就是用groupby按指定列分组,再配合agg方法一次性计算均值和标准差,同时自动排除不需要的subdir列。我一步步给你说明:
1. 核心思路
你需要按index、id、pair这三个字段的组合进行分组,把取值完全相同的行归为一组;然后仅对value列计算均值和标准差;最后将分组的字段从索引转回普通列,得到你想要的新DataFrame。
2. 代码示例
先构造一个模拟的DataFrame方便演示:
import pandas as pd # 模拟你的数据结构 df = pd.DataFrame({ 'index': [1, 1, 1, 2, 2, 2], 'id': ['A', 'A', 'A', 'B', 'B', 'B'], 'pair': ['X', 'X', 'X', 'Y', 'Y', 'Y'], 'subdir': ['dir1', 'dir2', 'dir3', 'dir1', 'dir2', 'dir3'], 'value': [10, 20, 30, 15, 25, 35] })
然后执行核心的聚合操作:
# 按index、id、pair分组,对value列计算均值和标准差 result_df = df.groupby(['index', 'id', 'pair'])['value'].agg(['mean', 'std']).reset_index()
代码解释:
groupby(['index', 'id', 'pair']):指定分组依据,确保只有这三列取值全相同的行会被分到一组['value']:明确只对value列做聚合,这样subdir列会被自动排除,不用额外删除agg(['mean', 'std']):一次性计算两个统计量,生成名为mean和std的新列reset_index():把分组用的index、id、pair从索引转回普通列,让结果结构更直观
3. 自定义列名(可选)
如果觉得默认的mean、std列名不够清晰,可以用字典格式指定自定义名称:
result_df = df.groupby(['index', 'id', 'pair'])['value'].agg( average_value='mean', std_deviation='std' ).reset_index()
这样新DataFrame的列名就会是average_value和std_deviation,可读性更强。
4. 特殊情况:如果index是行索引而非列
如果你的index是DataFrame的行索引(不是单独的列),可以先把行索引转成列再操作:
# 把行索引转为名为"index"的列 df = df.reset_index(names='index') # 再执行之前的聚合代码 result_df = df.groupby(['index', 'id', 'pair'])['value'].agg(['mean', 'std']).reset_index()
执行完后,result_df就是你想要的包含分组字段、均值、标准差的新DataFrame,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Ferdinando Randisi
相关产品推荐
相关产品推荐

