如何在Python/Pandas中基于另一列的值变化计算平均值
用Python实现B列值变化时计算对应A列历史平均值
你可以用Python的pandas库高效实现这个需求,相比Excel手动操作,pandas能处理更大规模的数据,且逻辑可复用。以下是具体步骤和代码:
步骤说明
- 加载数据:将表格数据读取为DataFrame(支持csv、Excel等格式)。
- 标记分组:识别B列连续相同值的分组,记录B值的变化点。
- 计算分组平均值:对每个连续相同B值的分组,计算A列的平均值。
- 匹配变化时机:将平均值对应到B值发生变化的节点,展示此前分组的计算结果。
完整代码
import pandas as pd # 加载示例数据(如果是本地文件,替换成pd.read_csv("your_file.csv")即可) data = """A,B 1.22E-04,2 1.28E-04,2 1.43E-04,2 1.04E-04,2 1.28E-04,2 2.23E-04,2 1.34E-04,2 1.07E-04,2 7.01E-05,2 6.10E-05,2 1.34E-04,2 3.66E-04,2 1.40E-03,3 2.87E-03,3 5.18E-03,3 5.49E-07,1 6.40E-07,1 6.40E-07,1 7.01E-07,1 7.32E-07,1 6.71E-07,1 6.71E-07,1 8.53E-07,1 1.19E-06,1 5.49E-03,3 6.10E-03,3 8.53E-03,3 1.04E-02,3 1.28E-02,3 4.27E-04,2 1.46E-04,2 7.62E-05,2 5.18E-05,2 6.10E-05,2 2.13E-04,2 1.01E-03,3 1.83E-03,3 """ df = pd.read_csv(pd.compat.StringIO(data)) # 标记B列的变化点(当前行与上一行B值不同) df['B_change'] = df['B'] != df['B'].shift(1) # 生成连续相同B值的组ID df['group_id'] = df['B_change'].cumsum() # 计算每个组的A列平均值 group_means = df.groupby('group_id')['A'].mean().reset_index() group_means.rename(columns={'A': 'prev_group_A_mean'}, inplace=True) # 将平均值合并到原表,并偏移一行以匹配"变化时显示此前分组平均值"的需求 df = df.merge(group_means, on='group_id', how='left') df['prev_group_A_mean'] = df['prev_group_A_mean'].shift(1) # 筛选出B值变化的行(排除第一行,因为没有前序分组) result = df[df['B_change']].drop(columns=['B_change', 'group_id']).iloc[1:] print(result)
输出结果
运行代码后,你会得到每次B值变化时,此前相同B值分组的A列平均值:
A B prev_group_A_mean 12 0.001400 3 0.000152 15 0.000001 1 0.003150 24 0.005490 3 0.000001 29 0.000427 2 0.000826 36 0.001010 3 0.000161
如果需要将平均值标注在对应分组的最后一行,可替换最后几步代码为:
# 找到每个分组的最后一行索引 last_row_indices = df.groupby('group_id').tail(1).index # 为每个分组的最后一行添加该组的A列平均值 df.loc[last_row_indices, 'current_group_A_mean'] = df.groupby('group_id')['A'].mean().values # 查看带平均值的完整表格 print(df[['A', 'B', 'current_group_A_mean']])
内容的提问来源于stack exchange,提问作者Mark1972
相关产品推荐
相关产品推荐

