在R语言中为现有DataFrame添加新的合并计算值
解决方法:合并impacteach和impactover为平均后的impact列
嘿,这个需求用pandas就能轻松搞定,我给你两种实用的实现方式,你可以根据自己的习惯选择:
方法一:拆分计算后合并
这种方法逻辑清晰,适合新手理解,步骤是先筛选目标行、计算平均值,再和原数据的其他行合并:
首先先构造你提供的示例数据(实际使用时替换成你的真实DataFrame即可):
import pandas as pd df = pd.DataFrame({ 'id': [1,1,1,2,2,2,3,3,3], 'init_cont': ['K','K','K','I','I','I','K','K','K'], 'family': ['S','S','S','S','S','S','D','D','D'], 'description': ['impacteach','impactover','read','impacteach','impactover','read','impacteach','impactover','read'], 'value': [1,3,2,2,4,1,3,5,3] })
接下来执行数据处理:
# 1. 筛选出需要计算平均的impacteach和impactover行 impact_subset = df[df['description'].isin(['impacteach', 'impactover'])] # 2. 按id、init_cont、family分组,计算value的平均值 impact_avg = impact_subset.groupby(['id', 'init_cont', 'family'])['value'].mean().reset_index(name='value') # 3. 给新数据添加description列,值为'impact' impact_avg['description'] = 'impact' # 4. 提取原数据中的read行,和新生成的impact行合并,最后按id和description排序 final_df = pd.concat([df[df['description'] == 'read'], impact_avg]).sort_values(by=['id', 'description']).reset_index(drop=True) print(final_df)
运行后得到的目标DataFrame:
id init_cont family description value 0 1 K S impact 2.0 1 1 K S read 2.0 2 2 I S impact 3.0 3 2 I S read 1.0 4 3 K D impact 4.0 5 3 K D read 3.0
方法二:透视表转格式计算
如果你的数据结构很规整(每个分组下的description没有重复),可以用透视表先转宽格式,计算平均后再转回长格式,代码更简洁:
# 转宽格式,将description转为列 pivot_df = df.pivot_table( index=['id', 'init_cont', 'family'], columns='description', values='value', aggfunc='first' # 因为每个分组下每个description只有一行,用first即可 ).reset_index() # 计算impact列,取impacteach和impactover的平均值 pivot_df['impact'] = pivot_df[['impacteach', 'impactover']].mean(axis=1) # 转回长格式,只保留需要的impact和read列 final_df = pivot_df.melt( id_vars=['id', 'init_cont', 'family'], value_vars=['impact', 'read'], var_name='description', value_name='value' ).sort_values(by=['id', 'description']).reset_index(drop=True) print(final_df)
这个方法的输出和方法一完全一致,适合喜欢用透视表处理格式转换的场景。
注意事项
如果你的实际数据包含更多列,只需要在groupby(方法一)或者pivot_table的index(方法二)中加入所有需要保留的列即可,确保分组时不会丢失信息。
内容的提问来源于stack exchange,提问作者melbez
相关产品推荐
相关产品推荐

