使用 Pandas 获取一个数据帧的连续段并将其复制到一个新数据帧中?

Using Pandas to get a contiguous segment of one dataframe and copy it into a new one?

使用 Pandas,我正在尝试 'slice'(抱歉,如果这不是正确的术语)数据帧的片段从一个 DF 到一个新的 DF,其中每个片段都是堆叠的一个在另一个之上。

代码:

import pandas as pd

df = pd.DataFrame(
{
    'TYPE': ['System','VERIFY','CMD','SECTION','SECTION','VERIFY','CMD','CMD','VERIFY','CMD','System'],
    'DATE': [100,200,300,400,500,600,700,800,900,1000,1100],
    'OTHER': [10,20,30,40,50,60,70,80,90,100,110],
    'STEP': ['Power On','Start: 2','Start: 1-1','Start: 10-7','End: 10-7','Start: 3-1','Start: 10-8','End: 1-1','End: 3-1','End: 10-8','Power Off']
})
print(df)

column_headers = df.columns.values.tolist()
col_name_type = 'TYPE'
col_name_other = 'OTHER'
col_name_step = 'STEP'

segments = []
df_blank = pd.DataFrame({'TYPE': ['BLANK ROW']}, columns = column_headers)
types_to_check = ['CMD', 'VERIFY']

type_df = df[df[col_name_type].isin(types_to_check)]
for row in type_df:
    if 'CMD' in row:
        if 'START:' in row[col_name_step].value:
            idx_start = row.iloc[::-1].str.match('VERIFY').first_valid_index() #go backwards and find first VERIFY
            step_match = row[col_name_step].value[6:] #get the unique ID after Start:
            idx_end = df[df[col_name_step].str.endswith(step_match, na=False)].last_valid_index() #find last instance of matching unique id
            segments.append(df.loc[idx_start:idx_end, :])
            segments.append(df_blank)

df_segments = pd.concat(segments)

print(df)

print(df_segments)

我的 segements 数组中没有填充任何内容,因此 concat 函数失败。

根据我的研究,我相信这可以使用 .loc 或 .iloc 来完成,但我似乎无法在其中获得有效的实施。

我的东风:

我想做什么:

欢迎任何帮助and/or指导。

编辑:为了澄清,我正在尝试创建一个由每组行组成的新 DF,其中开始是“CMD”行之前的“VERIFY”,该行还包含“开始: ",结尾是匹配的“CMD”行,有结尾。

EDIT2:我认为以下内容接近我的需要,但我不确定如何让它可靠地工作:

segments = []
df_blank = pd.DataFrame({'TYPE': ['BLANK ROW']}, columns = column_headers)
types_to_check = ['CMD', 'VERIFY']
cmd_check = ['CMD']
verify_check = ['VERIFY']

cmd_df = df[(df[col_name_type].isin(cmd_check))]
cmd_start_df = cmd_df[(cmd_df[col_name_step].str.contains('START:'))]

for cmd_idx in cmd_start_df.index:
    step_name = df.loc[cmd_idx, col_name_step][6:]
    temp_df = df.loc[:cmd_idx,]
    idx_start = temp_df[col_name_type].isin(verify_check).last_valid_index()
    idx_end = cmd_df[cmd_df[col_name_type].str.endswith(step_name, na=False)].last_valid_index()
    segments.append(df.loc[idx_start:idx_end, :])
    segments.append(df_blank)

df_segments = pd.concat(segments)

你可以使用str.contains

segmented_df = df.loc[df['STEP'].str.contains('Start|End')]
print(segmented_df )

我创建了一些代码来完成我想要的'slicing':

for cmd_idx in cmd_start_df.index:
    step_name = df.loc[cmd_idx, col_name_step][6:]
    temp_df = df.loc[:cmd_idx,:] 

    temp_list = temp_df[col_name_type].values.tolist()
    if 'VERIFY' in temp_list:
        idx_start = temp_df[temp_df[col_name_type].str.match('VERIFY')].last_valid_index()
    else:
        idx_start = cmd_idx

    idx_end = cmd_df[cmd_df[col_name_step].str.endswith(step_name, na=False)].last_valid_index()

    slides.append(df.loc[idx_start:idx_end, :])
    slides.append(df_blank)

我基本上创建了一个新的 DF,它是旧 DF 的子集,直到我的第一个 START 索引,然后我找到具有 VERIFY 的 last_valid_index,然后我使用该索引创建一个过滤的 DF idx_start 到 idx_end 然后最终将所有这些切片连接成一个 DF。

也许有更简单的方法,但我找不到。