pandas数据处理,字符串先拆分再合并

概述

实现之前文章中用SQL实现的功能:pandas数据处理,字符串先拆分再合并_第1张图片
得益于python简洁的表达式,以及pandas库的强大功能,实现起来非常轻松,关键代码仅三行:

代码

读取数据,预处理
import pandas as pd

# load data
df_org = pd.read_csv(r'D:\check_data.csv',sep='|',usecols=['结果'], encoding= 'utf-8')
df = df_org.copy()

# add index to column
df = df.reset_index()

# rename and drop none value
df.rename(columns={
     'index':'id','结果':'result'},inplace=True)
df.dropna(inplace=True)
原始样本数据
# org data where id in (2,3,32) 
df[df['id'].isin([2,3,32])]
id result
2 2 /*乙型肝炎病毒核酸定量\8.05E+6\
3 3 /*甲胎蛋白(化学发光微粒子免疫检测法)\1.4\
32 32 /乙肝e抗原(化学发光微粒子免疫检测法)\88.15\乙肝e抗体(化学发光微粒子免疫检测法)...
关键代码
# strip and split to list
df['result'] = df['result'].str.strip('/\\').str.split('\\')

# to key:value format
df['result'] = df['result'].apply(lambda x:[f'{k}:{v}' for k, v in zip(x[0::2],x[1::2])])

# list value to rows
df = df.explode('result').reset_index(drop=True)
结果样本数据
# see result where id in (2,3,32) 
df[df['id'].isin([2,3,32])]
id result
51 2 *乙型肝炎病毒核酸定量:8.05E+6
52 3 *甲胎蛋白(化学发光微粒子免疫检测法):1.4
279 32 乙肝e抗原(化学发光微粒子免疫检测法):88.15
280 32 乙肝e抗体(化学发光微粒子免疫检测法):11.42

说明

  • 第一步,将字符拆分拆分为列表,用series.str.split实现
  • 第二步,每两个值进行合并,用zip函数结合列表推导式批量实现
  • 第三步,将不固定长度的 list 形式的列数据,转为行,用pandas的explode函数实现

你可能感兴趣的:(Python,ETL/BI/大数据)