如何在Pandas DataFrame中分组指定标签并计算同时间均值
问题描述
我需要在DataFrame的tag_name列中对指定标签分组,计算同一time下raw_data的均值,并将结果保留在DataFrame中。我的DataFrame结构如下(实际含万余行):
tag_name time raw_data happy 5 300 8 340 angry 5 315 8 349 sad 5 400 8 480 ...
我尝试用透视表计算均值,但无法筛选指定标签,当前代码如下:
output = pd.pivot_table(data=dataset,index=['Timestamp'],columns=['Tag_Name'],values='Raw_Data',aggfunc='mean')
我希望计算sad和happy的均值,得到以下两种输出之一:
理想输出:
tag_name time raw_data sad_happy_avg happy 5 300 350 8 340 410 sad 5 400 8 480 angry 5 315 8 349
可接受输出:
tag_name happy sad avg time 5 300 400 350 8 340 480 410
解决方案
一、实现可接受输出
先筛选sad和happy的行,通过透视表整理数据后新增均值列:
# 筛选指定标签的行 filtered_df = dataset[dataset['tag_name'].isin(['sad', 'happy'])] # 生成以time为索引、tag_name为列的透视表 pivot_df = filtered_df.pivot(index='time', columns='tag_name', values='raw_data') # 计算每行的均值,新增avg列 pivot_df['avg'] = pivot_df[['sad', 'happy']].mean(axis=1) # 可选:重置索引,让time成为普通列 pivot_df = pivot_df.reset_index()
执行后即可得到按time分组,包含happy、sad原始值及对应均值的结果。
二、实现理想输出
先计算每个time下sad和happy的均值,再将结果合并回原DataFrame,仅在happy行填充均值:
# 分组计算每个time对应的sad和happy均值 avg_df = dataset[dataset['tag_name'].isin(['sad', 'happy'])]\ .groupby('time')['raw_data']\ .mean()\ .reset_index(name='sad_happy_avg') # 合并均值数据到原DataFrame,仅给happy标签的行赋值均值 result_df = dataset.merge(avg_df, on='time', how='left') result_df['sad_happy_avg'] = result_df.apply( lambda x: x['sad_happy_avg'] if x['tag_name'] == 'happy' else None, axis=1 )
处理后原DataFrame会新增sad_happy_avg列,仅happy行显示对应time的均值,其他标签行该列为空,与理想输出结构一致。
内容的提问来源于stack exchange,提问作者HoneyWeGOTissues
相关产品推荐
相关产品推荐

