首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Pandas获取一个数据的连续段并将其复制到一个新的数据段中?

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

Stack Overflow用户
提问于 2022-05-18 05:30:34
回答 2查看 53关注 0票数 0

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

代码:

代码语言:javascript
复制
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:我认为以下内容接近我的需要,但我不知道如何使它可靠地工作:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-20 00:43:28

我创建了一些代码来完成我想要的“切片”:

代码语言:javascript
复制
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中。

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

票数 0
EN

Stack Overflow用户

发布于 2022-05-18 05:46:58

您可以使用str.contains

代码语言:javascript
复制
segmented_df = df.loc[df['STEP'].str.contains('Start|End')]
print(segmented_df )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72283645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档