使用Pandas,我尝试‘切片’(抱歉,如果这不是正确的术语)的数据片段从一个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)在我的片段数组中没有填充任何内容,因此concat函数失败。
从我的研究来看,我相信可以使用.loc或.iloc来完成这一任务,但我似乎无法获得一个有效的实现。
我的DF:

我想要做的是:

欢迎任何帮助和/或指导。
编辑:为了澄清,我试图创建一个新的DF,它由每一组行组成,其中开始是“验证”,它位于包含" start :“的"CMD”行之前,末尾是匹配的有end的"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)发布于 2022-05-20 00:43:28
我创建了一些代码来完成我想要的“切片”:
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的一个子集,直到我的第一个开始索引为止,然后我找到已经验证的last_valid_index,然后使用该索引创建一个从idx_start到idx_end的过滤DF,然后将所有这些切片连接到一个DF中。
也许有更简单的方法,但我找不到。
发布于 2022-05-18 05:46:58
您可以使用str.contains
segmented_df = df.loc[df['STEP'].str.contains('Start|End')]
print(segmented_df )https://stackoverflow.com/questions/72283645
复制相似问题