如何在Pandas数据帧列中打印单独的真值组的第一个和最后一个索引

时间:2017-12-10 17:56:04

标签: python pandas dataframe boolean

我写了一个程序来分析HVAC数据的运行故障。程序通过一组规则提供输入数据,输出是像这样的Pandas数据帧。

enter image description here

从该输出中,我使用此代码遍历每一列,打印列本身的名称,并在其他列中的值为真的任何位置打印索引(日期)中的值:

    pos = 0
    for column in df:
        try:
            colname = faults[df.columns[pos]]
            print "The fault -" +str (colname)+ "- occurred on:"
        except Exception:
            pass
        try:
            print df.loc[df[column] == True, 'Date'].iloc[:]
        except TypeError:
            pass
        print
        pos += 1

这个输出看起来像这样。

enter image description here

代码工作正常,但我想稍微更改输出。我想只打印第一个和最后一个真值,以便输出显示类似"错误来自' x'到''"而不是每次出现真值时打印。

复杂的部分是,有时列中可能有多个1组,所以我不能只打印存在真值的第一个和最后一个索引。列可能看起来像(0,0,1,1,1,0,0,0,1,1,1,1,1,1,0,0,1,0),在这种情况下我会想要它打印"故障发生在这里,这里,这里和这里。"

有没有办法在Pandas数据帧列中打印每个真值组的第一个和最后一个索引?

1 个答案:

答案 0 :(得分:0)

这是我的建议,通过列表来查找开始和结束(如果需要则添加第一个和最后一个)并压缩它们: df = pd.DataFrame() df ['rule_1'] = [0] * 13 df ['rule_2'] = [0,0,1,1,1,0,0,0,1,1,1,1,0] df ['rule_3'] = [1] * 13 df.index = pd.date_range(“2017-12-25 00:00”,“2017-12-25 03:00”, FREQ = '0.25H') 对于df.columns中的col:     starts = [i for i,x in list(enumerate(df [col] .values))[1:-1] if ((X == 1)及(DF [COL] .values [I-1] == 0))]     ends = [i for i,x in list(enumerate(df [col] .values))[1:-1] if ((X == 1)及(DF [COL] .values第[i + 1] == 0))]     如果df [col] .values [0] == 1:         starts = [0] +开始     如果df [col] .values [-1] == 1:         结束=结束+ [ - 1]     打印(col)     对于zip中的x(df.index [starts],df.index [ends]):         打印(X)     打印() 输出: 规则1 rule_2 (时间戳('2017-12-25 00:30:00'),时间戳('2017-12-25 01:00:00')) (时间戳('2017-12-25 02:00:00'),时间戳('2017-12-25 02:45:00')) rule_3 (时间戳('2017-12-25 00:00:00'),时间戳('2017-12-25 03:00:00'))