【Pandas】根据条件对指定列和行做数据提取


昨天在核对页面数据和excel结果文件的数据时,由于excel表格内的字段列太多,数据也多,但页面只取部分数据和部分字段进行展示,肉眼核对数据时非常不方便。所以想通过根据一些指定条件筛选特定的数据和特定列,故写了以下代码。用的是pandas做处理。

我大概的思路是,先根据条件筛选出对应的行数据,再从获取到的数据中提取指定的字段。

根据条件提取指定行

我用了filter_row作为传入条件匹配的参数,指定为列表,列表内是要筛的数据,list内的每一个值就是对指定行数据的筛选。列表里面包的是字典,字典里写对字段的筛选规则,根据筛选规则对数据进行过滤。

传给函数的filter_row:

filter_row = [{'#Gene': 'MET', 'cHGVS': 'c.2888-15_2888-2delTCTCTCTGTTTTAA'}]

行数据筛选代码如下:

    exl = pandas.read_excel(file, dtype=str, sheet_name=sheet_name).fillna('None')

    df_temp = DataFrame()
    if filter_row is not None:
        for i in filter_row:
            exl_temp = None
            for k, v in i.items():
                exl_temp = exl.loc[exl[k] == v]
            df_temp = df_temp._append(exl_temp)
        exl = df_temp

过滤指定条件的数据

通过exl.loc[exl[字段列]==字段列的值]对数据进行过滤:(k为筛选的字段名,v为筛选的字段值,以字典方式传入)

exl_temp = exl.loc[exl[k] == v]

提取后的df行塞进临时变量,必须每次筛了之后重新赋值,因为append是返回处理后的结果,而不是对原df进行操作

df_temp = df_temp._append(exl_temp)

提取指定的字段列

根据条件筛选了指定行数据后,提取需要的字段列,其余字段不展示(先提取行再提取列的原因在于:有的字段需要作为筛选条件,但我最终又不想让这个字段返回出来,故先以完整的列做筛选,再对提取后的行数据过滤列)

要提取的列:

field_col = ['#Scale', '#Gene', 'Transcript', 'cHGVS', 'pHGVS']

提取列的代码:

    col_exl = list(exl.iloc[:0, :])
    extract_cols = []
    if field_col is not None:
        for i in field_col:
            if i in col_exl:
                extract_cols.append(col_exl.index(i))
        exl = exl.iloc[:, extract_cols]
    vals = exl.to_dict('records')

过滤指定字段列的数据

因为pandas的iloc和loc只能根据表格的index索引和ABCD字段名索引过滤,所以我的方案是先获取所有字段列,过滤指定字段的时候拿到他们的下标,最后用iloc指定列索引去过滤

获取所有列
col_exl = list(exl.iloc[:0, :])
过滤出只有指定字段列的数据
exl = exl.iloc[:, extract_cols]  # extract_cols为列表,里面为指定列的索引,例如:[1,3,5]

数据提取的完整代码

完整代码:

def data_extract(file, field_col: 'list' = None, filter_row: 'list' = None, sheet_name=''):
    exl = pandas.read_excel(file, dtype=str, sheet_name=sheet_name).fillna('None')

    col_exl = list(exl.iloc[:0, :])
    df_temp = DataFrame()
    if filter_row is not None:
        for i in filter_row:
            exl_temp = None
            for k, v in i.items():
                exl_temp = exl.loc[exl[k] == v]
            df_temp = df_temp._append(exl_temp)
        exl = df_temp

    extract_cols = []
    if field_col is not None:
        for i in field_col:
            if i in col_exl:
                extract_cols.append(col_exl.index(i))
        exl = exl.iloc[:, extract_cols]
    vals = exl.to_dict('records')
    return vals

主函数:

if __name__ == '__main__':
    snv_283_file = 'BGI283__DX1903__24SPS080828317.final.xlsx'
    snv_688_file = '688_TB_V1_1__24DSX080868804_24DBS080868804.final.xlsx'

    mutation = [{'#Gene': 'MET', 'cHGVS': 'c.2888-15_2888-2delTCTCTCTGTTTTAA'}]

    field_283 = ['#Scale', '#Gene', 'Transcript', 'cHGVS', 'pHGVS', 'HGVSp_Short', 'NewFunction', 'Case_var_freq',
                 'Case_DP4', 'Ctrl_DP4', 'Chr', 'Start', 'Ref', 'Allele', 'Target_gene']
    extract_data = data_extract(file=snv_283_file, sheet_name='filt_variation',
                                    field_col=field_283, filter_row=mutation)
    for i in extract_data:
        print(i)

时间紧,先这样,写得比较粗糙,后续再优化…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值