需求与步骤描述
1、现在有一个excel表的数据需要对数据进行处理
2、需要将其中的几列合并到一起生成一列数据 每列数据之间需要以 一个空格进行分割
3、对合并在一起的数据 按照 [中英文边界进行拆分,按照空格进行拆分,各类特殊进行拆分]
4、将按照三种方式拆分完的数据再次拼接成一个 excel 表[中间值用 DataFrame 存储]
5、去除新生成的excel表每个格数据所有的换行与回车,将空值表格用nan进行替换
6、删除整列都为空的列
7、将原始excel表格 xx列插入到新表格的首列,如果xx列没有则不插入
8、将数据输入到 深度学习模型中进行预测输出每个个预测结果
9、找到每一行第一个等于4的值
10、在原始数据中抽取 与预测是相等下标的值形成一个新的列表
需要注意与引发思考的地方
1、每一行的行号不是连续的值,如何保证使用正则拆分完的数据的行号与原始数据行号一致?
2、有某些列的数据是一个list 如何 将 list与str合并?
3、如何快速找到预测完数据每一列中第一个等于7的值?
4、如何根据预测数据第一个7的下标找到相应拆分数据对应的值?
Python版本与所需依赖模块
版本:python3.6
依赖包
pandas
numpy
re
准备虚拟数据
import pandas as pd
data = [["TAM和TRA整合模型下移动xxxx支付工具xxxx使用意愿研究",["辛彬","洋鸿"],["重庆工程""韩国国民","韩国大田"],"山西农经",["TAM","TRA","移动支付"],"F724;F832"],
["关于当前xxxx网络支付的思考及sssss应用创xx新建议",["徐亮"],["江西景德镇农商银行"],"中国商论",["支付方式","思考","应用创新","建议"],"F724,F832"],
["xxxx新冠肺炎xxxx疫情与xxxx消费",["臧恒","陈开"],["山东师范","山东大学"],"消费经济",["消费支出","移动支付","中国居民消费"],"F724"]] # excel 表数据
cols = ["Title","Author","Organ","Source","Keyword","CLC-中图分类号"] # 表头
indexs = [3,5,7] # 行号 注意行号不是连续的
df = pd.DataFrame(data, columns=cols,index=indexs) # 模拟读取excel表生成 DataFrame对象

需求与步骤的相关逻辑
1、将 Title,Author,Organ,Source, CLC-中图分类号 几列进行合并 生成一个新的列
PS:第一个问题,首先 Title,Author,Organ,Source, CLC-中图分类号 这几列数据可能有某几列不存在,也就是说在预处理时要先确定都有哪些列
需要判断原始的excel中到底存在哪几列 最简单的方法将所有的列表拿出来进行判断
col_list = df.columns.tolist() # 获取所有列名
# col_list = ['Title', 'Author', 'Organ', 'Source', 'Keyword', 'CLC-中图分类号']
判断 Title,Author,Organ,Source, CLC-中图分类号 是否存在 将存在的类名存入到一个list中以供使用
need_cols = ['Title', 'Author', 'Organ', 'Source', 'CLC-中图分类号'] # 这是需要的列名
my_new_headers = [need_col for need_col in need_cols if need_col in col_list] # 使用列表生成式获取到原始数据存在的列表名
将 my_new_header 这几列数据中缺失值用空格替换 并生成新的 DataFrame
my_new_df = df[my_new_headers].fillna("")

2、将 Title Author Organ Source CLC-中图分类号 按行合并 生成 新列 merge_data 注意有的行为 list str与list是没有办法直接合并的
my_new_df["merge_data"] = pd.Series(["" for _ in range(df.shape[0])], index=df.index).map(str) # 实例化一个 my_new_df列当前列为空
kong = pd.Series([" " for _ in range(df.shape[0])], index=df.index).map(str) # 每一列中间用空格填充
for my_new_header in my_new_headers:
if my_new_header in ["Author", "Organ"]: # 因为每一列是什么数据类型都是可以确定的 Author与Organ确定为 list
type_list = my_new_df[my_new_header].apply(lambda cell: ",".join(cell)).map(str) # 将这一列每个值按 逗号拆分
my_new_df["merge_data"] = my_new_df["merge_data"] + kong + type_list
elif my_new_header in ["Title", "Source", "CLC-中图分类号"]:
type_str = my_new_df[my_new_header].map(str)
my_new_df["merge_data"] = my_new_df["merge_data"] + kong + type_str

3、编写各种方式拆分的正则表达式
import re
china_or_english_re = re.compile(r"[ ,:~({[)}]]", re.I) # 中英文边界分割 [还存在着问题]
space_re = re.compile(r" ", re.I) # 按照空格分割
character_re = re.compile(r"[ ,/~`})][({;]", re.I) # 按照某些特殊字符分割
check_res = [space_re, china_or_english_re, character_re] # 由粗粒度向细粒度分割
4、对merge_data列使用正则表达式进行拆分生成三个拆分后的DataFrame
import numpy as np
concat_df_list = [] # 用于存储 DataFrame 对象
for check in check_res: # 循环正则表达式对merge_data列进行拆解 将每个拆解的数据生成一个 DataFrame
# 对 merge_data 列每一格 进行正则匹配,虽然没办法知道每一格会被拆成多少列,但是可以记录到每个格是属于哪一行的
newdf = pd.DataFrame(my_new_df["merge_data"].apply(lambda cell: list(set(check.split(cell)))).tolist(), index=df.index) # 使用set进行去重处理
newdf = newdf.replace("", np.nan) # 将每个孔空格用 nan 填充
concat_df_list.append(newdf)
5、将concat_df_list 数据按 横坐标进行合并
concat_df = pd.concat(concat_df_list, axis=1, ignore_index=True)

6、判断原始数据中是否有 Title 列 如果有的话将其插入到concat_df的首列中
if "Title" in df.columns.tolist():
concat_df.insert(0, "Title", df["Title"].tolist())
将数据传入模型中进行预测返回每个单元格预测的值
假装有预测
7、预测结果为
data = [
[1,3,1,3,4,5,1,2,1,4,1,5,1,5,6,1,3,1,5,1,6,1,6,4,1],
[9,5,3,7,6,5,8,2,1,4,1,5,1,5,6,1,3,1,5,1,6,1,9,8,7],
[3,4,6,7,8,9,0,2,4,4,1,5,1,5,6,1,3,1,5,1,6,1,1,7,1]
]
df_int = pd.DataFrame(data, index=indexs)

8、找到每一行 首个 等于 4 的下标
four_index = df_int.apply(lambda cell: cell.tolist().index(4) if 4 in cell.tolist() else 0, axis=1)

9、更新一下 concat_df 的列名
concat_df.columns = range(len(concat_df.columns.tolist()))

10、根据每一行 4 所在的下标在原始数据中找到相应的值生成一个list
value_data = [concat_df.iloc[i, j] for i, j in enumerate(four_index)]

结语
以上是我在近期工作中做的一些需求,其中还存在问题的就是对中英文边界的分割,到目前为止还未找到更好的办法进行分割,不过如果诸位有什么好的方法或者办法对其进行分割欢迎在下发留言。