# -*- 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)
#取當前時間,留作文件名用
time1 = datetime.datetime.now()
time1 = datetime.datetime.strftime(time1,'%m.%d_%H.%M.%S')
#基礎讀取 data=pd.read_excel("test.xlsx",sheet_name="數據",thousands=",") #簡單保存到excel文件 data.to_excel("all.xlsx",index=False,sheet_name='全部數據') #多sheet保存到文件 writer1=pd.ExcelWriter("test.xlsx") com_b2.to_excel(writer1,index=False,sheet_name='R2銀行出') com_a2.to_excel(writer1,index=False,sheet_name='R2財務出') writer1.save()
writer1.close()#記得關閉
#按照某列的值分組
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()]
#日期時間提取
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)
#去除所有空格
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.drop(index=[1])) # 刪除第二行數據
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-----")