长虫山小木屋

没有谁会为你踏雪而来 喜欢的风景要躬亲筚路

  博客园  :: 首页  :: 新随笔  :: 联系 ::  :: 管理
# -*- 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
pyinstaller -F --noconfirm -i d:\i.ico t1.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-----")

 

posted on 2020-10-29 14:37  长虫山小木屋  阅读(955)  评论(0编辑  收藏  举报