基于MultiIndex与多列的Pandas数据重采样问题
解决方法:将多记录传感器数据聚合为每日一行
嘿,这个需求在传感器数据处理里太常见了!咱们直接来一步步搞定它~
首先明确你的数据结构:ID(传感器编号)和date(日期)是MultiIndex,每个(ID, date)组合下有多条测量记录,目标是每个传感器每天只保留一行数据。这里核心是对每个传感器的每日数据做聚合,常用的方法有两种,按需选择即可:
方法一:直接用groupby聚合(最高效)
因为你的date已经是天级别的索引了,直接按MultiIndex的两个层级分组,然后选择你需要的聚合方式就行,比如取平均值、第一条/最后一条记录、最大值/最小值等:
import pandas as pd # 先确保date是datetime类型(如果原始数据是字符串格式的话) df.index = df.index.set_levels(pd.to_datetime(df.index.get_level_values('date')), level='date') # 1. 取当日所有测量值的平均值(最常用的聚合方式) df_daily_mean = df.groupby(level=['ID', 'date']).mean() # 2. 保留当日第一条测量记录 df_daily_first = df.groupby(level=['ID', 'date']).first() # 3. 保留当日最后一条测量记录 df_daily_last = df.groupby(level=['ID', 'date']).last() # 4. 取当日测量值的最大值 df_daily_max = df.groupby(level=['ID', 'date']).max()
举个实际例子:你提供的ID=1在2016-02-07有两条记录,用mean()聚合后,m_1会是(11 + 10.4)/2 = 10.7,m_2是(3.3 + 2.8)/2 = 3.05,完美得到每日一行的精简数据。
方法二:用resample(适合需调整时间频率的场景)
如果你之后可能需要调整时间粒度(比如从天转周/月),或者更习惯用resample的逻辑处理时间序列,也可以这么操作:
# 先把MultiIndex重置为普通列,方便后续处理 df_reset = df.reset_index() # 确保date是datetime类型 df_reset['date'] = pd.to_datetime(df_reset['date']) # 按ID分组,对date按天重采样,选择聚合方式(这里用均值) df_resampled = df_reset.groupby('ID').resample('D', on='date').mean() # 恢复原来的MultiIndex结构(ID和date作为双层索引) df_resampled = df_resampled.droplevel(0).set_index('ID', append=True).swaplevel(0, 1)
不过这种方法比groupby多了几步索引转换,如果你只是单纯要做每日聚合,方法一的效率会更高。
重要提醒:不管用哪种方法,一定要确保date列/索引是datetime类型,否则分组或重采样都会出错!如果原始date是字符串格式,一定要先用pd.to_datetime()转换。
内容的提问来源于stack exchange,提问作者nanounanue
相关产品推荐
相关产品推荐

