从大型Pandas DataFrame获取连续0值行索引的问题与解决
识别能耗数据中连续0值长时段的问题与解决
问题场景
我手头有一份按半小时统计能耗的数据集,目标是提取energy(kWh/hh)列中连续0值行的索引列表,以此识别长时间无能耗的时段。
数据集前几行示例:
LCLid tstp energy(kWh/hh) MAC000002 2012-10-12 00:30:00.0000000 0.0 MAC000002 2012-10-12 01:00:00.0000000 0.0 MAC000002 2012-10-12 01:30:00.0000000 0.0 MAC000002 2012-10-12 02:00:00.0000000 0.0 MAC000002 2012-10-12 02:30:00.0000000 0.0
我想要的输出是类似这样的嵌套列表,每个子列表对应一段连续0值的行索引:
[[0,1,2,...], [861958,861959,...], ...]
最初的尝试代码
我用more_itertools来分组连续索引,一开始运行正常,但后来出现了错误:部分非0值的行索引被错误加入结果,比如行1543677的能耗值是0.105却出现在列表里,而真正的0值行(比如行849246)是正常的。
代码如下:
import more_itertools as mit indices = df.loc[df[df.columns[2]] == df[df.columns[2]].isnull()].index.values.tolist() outages_indices = [list(group) for group in mit.consecutive_groups(indices)] long_outages_indices = [] for i in outages_indices: if len(i) >= 8: long_outages_indices.append(i)
问题原因与解决方法
经过排查,发现问题出在多CSV文件合并的环节:我是把多个CSV文件合并成一个DataFrame的,但每个新导入的CSV都会自动从0开始生成索引,导致整个DataFrame的索引出现重复、不连续的情况,这就打乱了后续识别连续索引的逻辑。
解决方法非常直接,在完成所有CSV文件的合并后,重置整个DataFrame的索引:
# 合并完所有CSV后执行 df = df.reset_index(drop=True)
重置索引后,整个DataFrame的索引变成连续且唯一的序列,再运行原来的筛选代码,就能准确得到符合要求的连续0值行索引列表了。
内容的提问来源于stack exchange,提问作者Zarif
相关产品推荐
相关产品推荐

