# -*- coding: UTF-8 -*-
import pandas as pd
import numpy as np
import datetime
import os
import sys
import warnings
warnings.filterwarnings('ignore')#忽略warning
#打包文件 -F是生成单文件
pyinstaller --noconsole -F --noconfirm t.py
#加ico图标
pyinstaller --noconsole -F --noconfirm -i i.ico t.py
#print打印显示设置
pd.set_option('display.max_columns', 1000000)
pd.set_option('display.max_rows', 1000000)
pd.set_option('display.max_colwidth', 1000000)
pd.set_option('display.width', 1000000)
#替换字符串内容
df["A"]=df['A'].str.replace("\n",'')
df.replace(' ', '', regex=True,inplace=True)
df.replace(' ', '', regex=True,inplace=True)
df.replace('\n', '', regex=True,inplace=True)
df.replace('\t', '', regex=True,inplace=True)
#取当前时间,留作文件名用
time1 = datetime.datetime.now()
time1 = datetime.datetime.strftime(time1,'%m.%d_%H.%M.%S')
#基础读取 data=pd.read_excel("test.xlsx",sheet_name="数据",thousands=",",skiprows=[0])
####excel 表头转换 ABCD
def getChar(number):
factor, moder = divmod(number, 26) # 26 字母个数
modChar = chr(moder + 65) # 65 -> 'A'
if factor != 0:
modChar = getChar(factor-1) + modChar # factor - 1 : 商为有效值时起始数为 1 而余数是 0
return modChar
def getChars(length):
return [getChar(index) for index in range(length)]
df.columns=getChars(df.shape[1])
#在首列添加序号列
df.insert(0,'序号',list(range(1,df.shape[0]+1)))
#e #读取多重表头并且合并
df2=pd.read_excel(file2,thousands=",",header=[0,1])
newcols=list(df2.columns)
newcols=["".join(x) for x in newcols]
df2.columns=newcols
#一次性读取所有表并合并
r=pd.read_excel(b_name,sheet_name=None,header=2,thousands=",")
#合并所有表
for index,sheet in enumerate(r.keys()):
#print(index,sheet)
if index==0:
b=r[sheet].copy()
else:
b=pd.concat([b,r[sheet]], ignore_index=True)
#简单保存到excel文件 data.to_excel("all.xlsx",index=False,sheet_name='全部数据') #多sheet保存到文件 writer1=pd.ExcelWriter("test.xlsx",engine='xlsxwriter')#engine='xlsxwriter',自动筛选配置 com_b2.to_excel(writer1,index=False,sheet_name='R2银行出') com_a2.to_excel(writer1,index=False,sheet_name='R2财务出')
#添加首行自动筛选按钮
worksheet = writer1.sheets[name]
worksheet.autofilter(0,0,com_b2.shape[0],com_b2.shape[1]-1)
#这里参数1,2是开始坐标,3,4是结束坐标,也可以写成:worksheet.autofilter('A1:D11')
writer1.close()#记得关闭
#排序
df.sort_values(by='开始时间',ascending=True,inplace=True,ignore_index=True)
#随机打散
df=df.sample(frac=1)
#其中参数frac是要返回的比例,比如df中有10行数据,我只想返回其中的30%,那么frac=0.3
#按照某列的值分组
new=pd.read_excel(file,thousands=",")
GroupBy=new.groupby("对方户名")
for name,group in GroupBy:
print(name)#分组的名称
print(group)#分组的数据
#建立副本
df2=df1.copy()
# 创建一个空的 DataFrame
df_empty = pd.DataFrame(columns=['A', 'B', 'C', 'D'])
#apply lambda遍历修改某一列的值
data_bank_chu[bank_col_chu]=data_bank_chu[bank_col_chu].apply(lambda x:abs(x))
#新增数据
res1 = pd.concat([res1, row], ignore_index=True)#拼接多个df
res2 = res2.append(row, ignore_index=True)#新增一行数组
#选取最大的 n 个值
print(df.nlargest(3,'Math')) # 从大到小排序,并取得 'Math' 最大的 3 行
#选取最小的 n 个值
print(df.nsmallest(3,'Math')) # 从大到小排序,并取得 'Math' 最大的 3 行
#数据类型转换
df["Customer Number"] = df["Customer Number"].astype("int")
#数据转list
data.values.tolist()
#遍历每一条记录
for index,row in he.iterrows():
print(row)
#NA数据清理
data_zhang = data_zhang.dropna(subset=["科目名称"])#清空
data_bank = data_bank.fillna(0)#填充0
#NaN数据筛选
print(data[data['支出金额'].isnull()])
print(data[data['支出金额'].notnull()])
data=data[data['支出金额'].notnull()]
#pandas转json
json = df.to_json(force_ascii=False,orient='records')
#日期时间提取
ding["time"] = pd.to_datetime(ding["开票日期"],format="%Y-%m-%d%H:%M:%S")
ding["month"] = ding["time"].dt.month
#绝对路径读取csv
path=r'C:\Users\j\Desktop\g\用户信息列表.xls'
data=pd.read_csv(path,sep='\t',encoding='gbk',low_memory=False)
#查找包含字符串以及不包含
b0=b[~b[0].str.contains("中心")]
b1=b[b[0].str.contains("中心")]
#多个关键字筛选:
df=df[df["列名"].str.contains("云南|红河|昆明")]
#去除所有空格
df = df.applymap((lambda x: "".join(x.split()) if type(x) is str else x))
#所有sheet表名
reader = pd.ExcelFile(file)
sheet_names = reader.sheet_names
#输入信息后继续执行
gogogo=True
while gogogo:
in1=input("开始导入?")
if in1=="y" or in1=="Y":
gogogo=False
else:
exit("终止!")
#删除行列
data=data.drop(index=[1])) # 删除第二行数据
data=data.drop(columns = ['A'])) #删除A列数据
#多df合并
res = pd.merge(da,db,on=["a","b"],how='outer',suffixes=("_a","_b"))
#重新排列列顺序,已经去除多余的列
res_01=res_01[["c","b","a"]]
#两个df数据的补集(index是一致的,同源)
dif=res[~res.index.isin(other.index.to_list())]
#对比两列数据并且把结果标记到在第三列
res["chaiyi"] = res.apply(lambda x: "Yes" if x["a"] == x["b"] else "No", axis=1)
#记录程序运行时间
start = time.time()
pass#要操作的事情
end = time.time()
print('程序加载用时:%s秒' % (end - start))
#列读取为str对象类型
df = pd.read_excel ("test.xlsx" , converters={'类别编码':str})
#合并多列:
d2=pd.DataFrame(d.groupby('a').agg({'c':'first', 'b':'sum'})).reset_index()
未完待续
操作word,docx
from docx import Document from docx.shared import RGBColor document=Document(r"需生成报告.docx") paragraphs=document.paragraphs print(len(paragraphs)) for p in paragraphs: print(p.text) tables=document.tables table=tables[0] for r,row in enumerate(table.rows): for c,cell in enumerate(row.cells): print(r,c) print(cell.text) p = cell.paragraphs[0] p.clear() run = p.add_run("徐工科技六角恐龙") if c%2==0: run.font.color.rgb = RGBColor(250, 0, 0) #保留DOCX原来文字段落的格式,替换文字的方法 for run in (paragraphs[3].runs): run.clear() paragraphs[3].runs[0].add_text("ddd") document.save("res.docx")
xlwings相关操作
import xlwings as xw tfile="test.xlsx" newfile="new.xlsx" app = xw.App(visible=False, add_book=False) app.display_alerts = False app.screen_updating = False wb = app.books.open(tfile) ws = wb.sheets[0] ws2 = wb.sheets[1] ws.range("A1").value = 101 ws2.range("A1").value = 102 wb.sheets[1].delete()
ws.api.Rows(1).Delete() #删除首行
ws.api.Rows(1).Insert #插入行
ws.api.Columns(1).Delete()# 删除首列
ws.api.Columns(1).Insert() #插入列
ws["A1"].value="aaa" #单元格赋值
ws.range("A1","B5").value="bb" #A1到B5单元格全部赋值
ws["A1"].value=[1,2,3] # A1,B1,C1的值依次填成1,2,3,横向
ws["A1"].options(transpose=True).value=[1,2,3] #A1,A2,A3的值依次填成1,2,3,竖向
#将1,2,3,'D'输入第一行,4,5,6,'A'输入第二行,注意,两个的长度必须一致,否则出错
list1=[[1,2,3,'D'],[4,5,6,'A']]
ws["A1"].value=list1
ws["A1048576"].end('up').row #最大行,根据单元格位置
print(ws["XFD1"].end('left').column) #最大列,根据单元格位置
lst=ws.range("A1:A"+str(ws["A1048576"].end('up').row)).value #把excel单列值读取到列表中,str()是要把int转为string
lst1=ws.range("A1:C"+str(ws["A1048576"].end('up').row)).value # 把excel连续两个列的值读取到列表中
lst=ws.range("A1:A"+str(ws["A1048576"].end('up').row)).value #A列的值
lst2=ws.range("C1:C"+str(ws["A1048576"].end('up').row)).value#C列的值
lst3=list(zip(lst,lst2))#合并起来然后转为列表
dicta=dict(lst3)#列表转为字
#填充一列方法1:
list1 = [[1],[2],[3],[4],[5]]
ws.range('A1').value = list1
#填充一列方法2:
list2 = [1,2,3,4,5]
ws.range(1,1).options(transpose=True).value = list2
wb.save() wb.save(newfile) #这里另存为,习惯先复制模板可以用系统命令,感觉更快 cmd = 'copy ' + tfile + ' ' +newfile #不弹黑窗口 subprocess.call(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) wb.close() app.quit()
简单开启多进程,加速计算:
# -*- coding: UTF-8 -*- from multiprocessing import Pool import os, time def worker(msg,b): t_start = time.time() print(b+"%s开始执行,进程号为%d" % (msg, os.getpid())) print(2**1024**msg) #做一个复杂幂运算,直接可以拉满CPU用完内存,爽不爽。 t_stop = time.time() print(msg, "执行完毕,耗时%0.2f" % (t_stop - t_start)) if __name__ == '__main__': po = Pool(30) # 最大的进程数为3 for i in range(0, 30): '''每次循环将会用空闲出来的子进程去调用目标''' po.apply_async(worker, (i,"ss"))
#这里可以用.get()获得返回值 print("----start----") po.close() # 关闭进程池,关闭后po不再接受新的请求 po.join() # 等待po中的所有子进程执行完成,必须放在close语句之后 '''如果没有添加join(),会导致有的代码没有运行就已经结束了''' print("-----end-----")