如何打印数据帧列中不同真值组的第一个和最后一个索引

2024-06-16 02:21:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个程序,分析暖通空调数据的运行故障。程序通过一组规则来输入数据,而输出是一个类似这样的数据帧

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'到'y'之间”,而不是每次真值出现时打印

复杂的是,有时一列中可能有多组1,所以我不能只打印第一个和最后一个有真值的索引。列可能看起来像(0,0,1,1,1,0,0,0,1,1,1,1,1,0,0,1,0),在这种情况下,我希望它打印“故障从这里到这里,从这里到这里,再到这里。”

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


Tags: 数据pos程序df规则columnpass故障
1条回答
网友
1楼 · 发布于 2024-06-16 02:21:07

以下是我的建议,请浏览列表以找到开始和结束(如果需要,请添加第一个和最后一个)并压缩它们:

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')

for col in df.columns:   
    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))]
    if df[col].values[0]==1:
        starts = [0]+starts
    if df[col].values[-1]==1:
        ends = ends + [-1]
    print (col)
    for x in zip(df.index[starts], df.index[ends]):
        print(x)
    print()

输出:

规则1

规则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'))

规则3

(时间戳('2017-12-25 00:00:00'),时间戳('2017-12-25 03:00:00'))

相关问题 更多 >