pandas/openpyxl表格数据的处理及qtdesigner显示

pandas处理Excel数据格式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

pandas读取数据后从(0,0)开始,不包括标题行
openpyxl读取数据后从(1,1)开始,包括标题行
tableWidget添加数据时,首先要确定其行列数,数据从(0,0)开始,不包括标题行
使用字符串访问变量可使用,df = locals()[“df” + str(i)]
新建的空df不能使用iloc赋值,因为iloc是根据下标定位,空表没有下标,可以用定义index=range(9), columns=range(9)解决,也可用loc按行添加数据

一、pandas

1.读取excel

df = pd.read_excel(
	io, #文件路径
	sheet_name=0, #读取的工作表,从0开始,(接受str, int, list)
	header=0, #指定作为列索引的行,从0开始,可以指定多行,(接受int, list,None)
			  #header=None:表示不使用数据源中的表头
			  #若指定header为多行,则不能使用usecols,会报错
	names=['a','b'], #将列名自定义为a,b,列名的数量必须与读取的列的数量一致
	index_col=[0,1], #指定作为行索引的列,可以指定多列
	usecols=None, #指定只使用哪些列,(接受list,str)
				  #待读取的列号必须放入列表,否则会报错
				  #接受str的形式为“A:C”
	squeeze=False, 
	dtype={"a":"int32","b":"float64"}, #设置数据格式,时间周期、时间戳等
	engine=None, 
	converters=None, 
	true_values=None, 
	false_values=None, 
	skiprows=None, #跳过哪些行,不读取
	nrows=10, #只读取前10行
	na_values=0, #处理缺失值
	keep_default_na=True, 
	verbose=False, 
	parse_dates=[0,1], #尝试将0,1列数据解析为日期格式
	date_parser=None, 
	thousands=",", #对于文本格式的数字,根据千分位分隔符,将其解析为数字格式
	comment=None, 
	skipfooter=0, 
	convert_float=True, #将1.0转化为1
	mangle_dupe_cols=True, #如果列名重复则自动重命名
	**kwds)

2.pandas中时间数据的处理

io = ".\基础信息.xlsx"
    '''————————————————————读取表格,并进行预处理'''
    df = pd.read_excel(io,sheet_name=0)
    df.fillna("999",inplace=True)

使用以下方式将时间数据设置为时间戳格式,便于后续的处理

df['date'] =  pd.to_datetime(df['date'], format='%Y-%m-%d %H:%M:%S')

使用以下方法可以分别读取该列时间数据涉及的年-月-日-时-分-秒信息,以Series格式展示处来,使用后在原df的date列中覆盖新的数据

df['date'].dt.second
df['date'].dt.minute
df['date'].dt.hour
df['date'].dt.day
df['date'].dt.month
df['date'].dt.year
# 只保留年月日,结果为2023-02-28 00:00:00
df['date'] = df['date'].dt.normalize()

3.pandas中统一数据的格式

3.1 替换数据replace

# 3.1.1 整体替换
# 将数据表df中的所有A替换为B
df.replace('A','B')
# 将数据表df的'col'列中的A替换为B,inplace=True在原表中修改
df['col'].replace('A','B',inplace=True)
# 将数据表df的'col'列中的A替换为B,C替换为D
df['col'].replace(['A','C'],[B,D],inplace=True)
# 使用正则表达式替换内容
df['col'].replace('[A-Z]',666,regex=True,inplace=True)
# 3.1.2 部分替换
# 使用str.replace将数据表df的'col'列中的每行中包含的A替换为B
#该方法不能使用inplace=True使原表发生改变,所以要用df['col']接收,最终效果一样
#col列格式必须为str
df['col']=df['col'].str.replace("A","B")

4.pandas中查找符合某种条件的数据

使用以下方法可生成新的df,用于后续分析

#获取ID列中等于1000的行
df[df['ID']==10000]
#获取ID列中小于等于1000的行
df[df['creativeID']<=10000]
#删除指定列中值为2和5所属的行,^为异或运算符
df[(True ^ df['ID'].isin([2,5]))]
#多条件过滤
df_[(df_["时间"] >= last_year) & (df_["时间"] <= this_year)  ]
#筛选出指定数据并进行修改
df_["性别"].loc[df_["性别"]=="男"] = 1

5.pandas中查找包含指定内容的行

# 获取A列值等于2的行
df[df['A'] == 2]
# 获取A列中包含li的行,A列不能有NAN,会报错
# 可使用na=False处理,当na=True,则选择NaN的行,如果na=False,则不选择NaN的行。
df[df['A'].str.contains('li', na=False)]
# 使用正则表达式匹配
# str.contains('i*')默认regex=True,即默认'i*'是正则表达式
# 如果要定'i*'为字符串,则可用regex=False
df[df['A'].str.contains('i*')]
# 匹配A列以e结尾/开始的行,有参数na=True,用法同上
# 始终区分大小写,不能使用正则表达式,'e'不会默认为正则表达式
# match与startswith类似,且都没有regex参数,但match可以使用正则表达式
df[df['A'].str.endswith('e')]
df[df['A'].str.startswith('e')]
df[df['A'].str.match('\d')]
# 返回字符"A"在C列的值中的位置(0开始),1和3分别为开始和结束位置
# index、find用法相同,但未查到时find会返回-1,index会报错substring not found,影响下一步执行
df['C'].str.index('A',1,3)
df['C'].str.find('A',1,3)
# 提取出字符串中要查找的内容,以列表形式返回结果,支持正则表达式
s.str.findall('\d+') 

二、openpyxl

#单元格访问方法:
ws['A1'].value
ws.cell(1,1).value
#获取第一行,row是单元格对象而非内容,row.value是单元阁内容
for row in self.ws1[1]:
	print(row.value)
#遍历,ws.rows返回的是每一行对象cells,cell是每一行对象中的一个单元格对象,cell.value是每一个单元格对象的值,ws.cols同理
for cells in ws.rows:  # 按行遍历
    for cell in cells:
        value = cell.value

三、tableWidget

代码如下(示例):

1.读取数据
wb = openpyxl.load_workbook(".\关键字.xlsx")
    list_excel_name = wb.sheetnames
    ws = wb[list_excel_name[0]]
    ws1 = wb[list_excel_name[1]]
    ws_rows = ws.max_row
    rowmax = ws1.max_row
    colmax = ws1.max_column
2.设定表格的行数和列数,否则无法向表格中添加数据
self.tableWidget.setColumnCount(self.colmax)
self.tableWidget.setRowCount(self.rowmax)
# 创建表头,biaoti为表头数组
self.tableWidget.setHorizontalHeaderLabels(biaoti)
# 隐藏垂直表头
 self.tableWidget.verticalHeader().setVisible(False)  
# 隐藏水平表头
self.tableWidget.horizontalHeader().setVisible(False) 
# 设置显示格子线
self.tableWidget.setShowGrid(True)
# 设置隔行变色
self.tableWidget.setAlternatingRowColors(True)
# 整行选中的方式
self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
# 设置表头样式
self.tableWidget.horizontalHeader().setStyleSheet(
    "QHeaderView::section{background-color:rgb(155, 194, 230);color: black;};")
# 禁止编辑
self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.tableWidget.setWordWrap(True)
# 根据内容自动调整列宽
self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
3.显示数据的核心语句,openpyxl读取的m、n,11开始,根据需要跳整
for m in range(2,self.rowmax+1):
    for n in range(1, self.colmax+1):
        print(self.ws1.cell(m, n).value)
        newItem = QTableWidgetItem(self.ws1.cell(m, n).value)
        self.tableWidget.setItem(m-2, n-1, newItem)
 ###在qtdesigner中的对应的属性
 WordWrap 允许换行
 

总结

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值