如何基于Series阈值筛选Pandas DataFrame行并返回对应索引
问题描述
我正在对44个踏板转动周期(每个周期为长度100的时间序列)中的每个数据点进行序列分析。需要找出**均值偏差DataFrame(形状(44, 100))中,当行内数值低于对应0.25倍标准差阈值Series(形状(44,))**时的索引值,最终输出一个包含44个数值的列表。要求将mean_dev的每一行与sd_quarter的对应值进行比较(注:原描述中“每一列”为表述误差,结合数据结构应为每一行)。
现有代码
# 将(100, 44)的cycles转置为(44, 100),方便计算expanding.mean transpose_cycles = cycles.transpose() # 创建空DataFrame存储结果 cumulative_ave = pd.DataFrame() sd_quarter = pd.DataFrame() cum_sd = pd.DataFrame() mean_dev = pd.DataFrame() # 计算每个踏板周期整个时间序列的累积均值 cumulative_ave = transpose_cycles.expanding().mean() # 将(100, 1)的mean_cycle转置为(1, 100),方便和cumulative_ave计算 mean_transpose = mean_cycle.transpose() # 计算均值偏差:平均周期 - 累积均值 mean_dev = mean_cycle - cumulative_ave # 计算每个踏板周期的标准差 cum_sd = transpose_cycles.std(axis=1) # 计算0.25倍标准差 sd_quarter = cum_sd*0.25
数据结构信息
mean_dev信息:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 44 entries, 0 to 43 Data columns (total 100 columns): dtypes: float64(100)
sd_quarter信息:
<class 'pandas.core.series.Series'> RangeIndex: 44 entries, 0 to 43 Series name: None Non-Null Count Dtype ---------------------------- 44 non-null float64 dtypes: float64(1)
解决方案
以下代码可实现需求,通过矢量化操作高效完成逐行比较,最终生成包含44个数值的列表:
# 逐行比较,获取每行第一个小于对应sd_quarter值的列索引 result = mean_dev.lt(sd_quarter, axis=0).idxmax(axis=1).tolist()
代码说明
mean_dev.lt(sd_quarter, axis=0):逐行判断mean_dev的元素是否小于sd_quarter的对应值,返回布尔值DataFrame.idxmax(axis=1):对每行取第一个为True的列索引(True对应数值1,False对应0,idxmax会返回第一个最大值的位置).tolist():将结果转换为列表,得到包含44个元素的最终输出
内容的提问来源于stack exchange,提问作者DanWilliams99
相关产品推荐
相关产品推荐

