如何按指定时间范围对Pandas数据分组求电流均值?
我明白你的问题啦——你是把多段独立的时间序列拼在了同一个DataFrame里,现在要按指定的6个时间范围分别计算每一段的电流均值,而不是按单个时间点分组对吧?原来的代码直接按Time (Min)分组,相当于把所有时间点相同的行凑到一起,当然会出错。
下面给你两种可行的解决方法,都能得到你要的6行均值结果:
方法一:手动切片分组(直观易懂)
适合数据量不大、组数量少的场景,直接按索引定位每组数据,再计算均值:
import pandas as pd Time = [0,1,2,3,4,0,1,2,3,4,0,1,2,3,0,1,2,3,4,5,6,0,-1,3,4,0,1,1,2,4] Current = [0,2,3,4,5,1,2,3,4,6,0,1,1,2,-1,2,2,3,4,5,5,0,-1,3,4,0,1,1,2,4] df = pd.DataFrame({'Time (Min)': Time,'Current (A)': Current}) # 定义每组的索引范围和对应的时间上限 groups_specs = [ (0, 4, 4), # 起始索引, 结束索引(不含), 时间上限 (5, 9, 4), (10, 13, 3), (14, 21, 6), (21, 25, 3), (25, 30, 4) ] # 遍历每组计算均值 results = [] for start_idx, end_idx, time_max in groups_specs: # 提取当前组的数据 group_data = df.iloc[start_idx:end_idx] # 过滤出符合时间范围的行(虽然你的数据本身匹配范围,但加上更严谨) valid_data = group_data[group_data['Time (Min)'] <= time_max] # 计算均值并保存结果 avg_current = valid_data['Current (A)'].mean() results.append({ 'Group': len(results)+1, 'Time Range': f'0-{time_max}', 'Average Current (A)': round(avg_current, 2) }) # 转成DataFrame查看最终结果 result_df = pd.DataFrame(results) print(result_df)
方法二:自动添加组标签(灵活高效)
如果组数量多或数据量大,先给每行分配组ID,再按组分组处理:
import pandas as pd import numpy as np Time = [0,1,2,3,4,0,1,2,3,4,0,1,2,3,0,1,2,3,4,5,6,0,-1,3,4,0,1,1,2,4] Current = [0,2,3,4,5,1,2,3,4,6,0,1,1,2,-1,2,2,3,4,5,5,0,-1,3,4,0,1,1,2,4] df = pd.DataFrame({'Time (Min)': Time,'Current (A)': Current}) # 定义每组的长度和对应的时间上限 group_lengths = [5,5,4,7,4,5] time_ranges = [4,4,3,6,3,4] # 给每行添加组ID和对应的时间上限 df['Group ID'] = np.repeat(range(1, len(group_lengths)+1), group_lengths) df['Time Max'] = np.repeat(time_ranges, group_lengths) # 按组分组,计算符合时间范围的电流均值 result_df = df.groupby('Group ID').apply( lambda x: x[x['Time (Min)'] <= x['Time Max'].iloc[0]]['Current (A)'].mean() ).reset_index(name='Average Current (A)') # 补充时间范围列 result_df['Time Range'] = [f'0-{tr}' for tr in time_ranges] print(result_df)
两种方法最终都会输出6行结果,对应你指定的6个时间范围的电流均值。核心思路都是先区分开每一段独立的实验数据,再在每一段内计算均值,而不是跨段聚合相同时间点的数据。
内容的提问来源于stack exchange,提问作者Berbason
相关产品推荐
相关产品推荐

