pandas按datetime分组减列均值去趋势输出全零如何解决
问题产生原因
- 核心原因是分组操作异常,导致每个分组仅包含1行数据:此时每个元素对应的组内均值就是元素本身,相减后结果自然全为0。
- 结合你提供的代码片段,具体可排查以下常见错误:
- 变量名不统一:构造的DataFrame变量名为
arr,但分组时使用了未定义的df变量,若实际运行时df是其他列结构错误的表,会触发分组异常。 - 未正确设置列名:你构造DataFrame时没有指定
columns参数,默认列名为0~5的整数,此时执行groupby(['Datetime'])会直接报KeyError,若你提前赋值列名时出错,会导致分组键并非预期的时间列,最终分组粒度错误。 - 分组键设置错误:若误将唯一值列作为分组键,也会出现单元素分组的问题。
- 变量名不统一:构造的DataFrame变量名为
正确实现代码
首先给DataFrame设置正确列名,再执行分组去趋势即可,无需自定义lambda函数,内置方法运行效率更高:
import pandas as pd # 构造DataFrame并指定列名 arr = pd.DataFrame( [[201207310930, 0.0022, -0.0160, 0.0055, 0.0324, -0.0328], [201207310930, 0.0040, -0.0073, 0.0293, 0.0465, -0.0275], [201207310930, -0.0095,-0.0080, 0.0215, 0.0525, -0.0317], [201207311030, -0.0005,-0.0040, -0.0149, 0.0135, 0.0488], [201207311030, -0.0087,-0.0240, 0.0134, 0.0480, -0.0331]] , columns=['Datetime','x1','x2','x3','x4','x5'] ) # 选择需要去趋势的列:排除Datetime和x1 process_cols = arr.columns.drop(['Datetime', 'x1']) # 分组计算均值后广播到所有行,原始值减去对应均值完成去趋势 output = arr[process_cols].sub(arr.groupby('Datetime')[process_cols].transform('mean')) # 可选:将保留的Datetime、x1列合并回结果 output = pd.concat([arr[['Datetime', 'x1']], output], axis=1)
运行上述代码得到的结果和你预期的输出完全一致。
内容的提问来源于stack exchange,提问作者helloimgeorgia
相关产品推荐
相关产品推荐

