使用 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。
也许有更简单的方法,但我找不到。
使用 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。
也许有更简单的方法,但我找不到。