根据条件对指定列和行做数据提取
昨天在核对页面数据和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)
时间紧,先这样,写得比较粗糙,后续再优化…