Re: [問題] 如何用Pyqt去搜尋excel內特定區塊的數值

作者: rayko0702 (吃飯 睡覺 打東東)   2023-02-01 14:58:38
openpyxl難用到爆...pandas簡單易懂 一個forloop就寫完了
你這問題核心應該是要修邊 讓每個人的表可以是任意n*m的大小
先假設當初寫表的的人沒有很認真排版
表任意排版如下
https://i.imgur.com/EgpTkS6.jpg
可以看到空行空列很隨興排
所以需要把取出來的各dataframe去邊(去nan)
如下
https://i.imgur.com/ZbB06Qp.jpg
再把各個處理好的dataframe存到字典裡面
=====================程式碼&說明============================
import pandas as pd
import numpy as np
df = pd.read_excel(r"你的路徑", header=None)
index_notna = list(df.loc[pd.notna(df[0])].index) #找出各學生開始的列成list
index_notna.append(len(df)) #等等跑迴圈最後一組的結束位置
students = {} #創一個空字典 裡面每個key(學生名)會對到他的dataframe
for i in range(len(index_notna)-1): #跑迴圈歷遍,學生數會是index的長度-1
student_name = df.loc[index_notna[i],0] #取出學生名
range_a = np.arange(index_notna[i],index_notna[i+1]) #設定找尋的上下邊界
A = df.loc[range_a,1:] #A不取學生那行
A = A.dropna(how = 'all', axis = 0) #移除所有為值為nan的列
A = A.dropna(how = 'all', axis = 1) #移除所有為值為nan的行
row_names = list(A.iloc[:,0][A.iloc[:,0].notna()]) #列名list
col_names = liststudents[(A.iloc[0,:][A.iloc[0,:].notna()]) #行名list
A = A.reset_index(drop=True) #重置列的序號
A = A.T.reset_index(drop=True).T #重置行的序號
A = A.drop(index = 0, columns = 0) #移除第0行跟第0列
A.columns = col_names #重新標籤
A.index = row_names #重新標籤
students[student_name] = A #將處理好去邊的表格放進字典裡
namelist = list(students.keys()) #學生名單list
=============================================================================
後面找各學生的表呼叫students['學生的名子'] 就能叫出修飾好的表了
有比較聰明的寫法再歡迎前輩指教...剛自學python一個月
很多指令還不熟 如果有比較聰明的指令可幫忙提點 謝謝
※ 引述《ninifs (快快樂樂過每天 !)》之銘言:
: 請教各位大大,
: 小弟剛學會一些基本的python和openpyxl操作,
: 也有時候也會用Pyqt寫成一個小介面幫助自己工作效率,
: 目前遇到困難是工作上想實作以下操作,希望有高手幫忙指引一下!
: excel內的數據如最下面,
: 主要是有多個學員資料(至少100個,學員A,B,C,D......)
: 每個學員有一個區塊的資料,
: 每一個區塊的rows和columns數量不固定,
: (就是表格內的 "day"和"內容"數量不固定)
: 希望能用Pyqt的介面,做出三個下拉選單,
: 第一個下拉選單可以選 => 學員A,學員B,學員C...etc
: 第二個下拉選單可以選 => day1,day2,day3...etc
: 第三個下拉選單可以選 => 內容1,內容2,內容3...etc
: 這樣就可以定位到某一個cell,然後回報數值
: 可是我第一步就卡住了,
: 若第一個下拉選單選了 "學員B",
: 我該怎麼讓程式在接下來的動作中,
: 只會去尋找"學員B"那個區塊裡面的東西 ?(因為那個區塊的大小不固定...@@)
: 先謝謝各位大神了!
: ===========example=================
: 學員A
: 內容1 內容2 內容3
: day1 23 12 65
: day2 14 23 42
: day3 5 21 654
: day4 16 5 879
: day5 86 435 433
: 學員B
: 內容1 內容2 內容3 內容4 內容5
: day1 23 12 65 85 67
: day2 14 23 42 883 67
: day3 5 21 654 13 98
: 學員C
: 內容1 內容2
: day1 23 12
: day2 14 23
: day3 5 21
: day4 16 5
: day5 86 435
: day6 123 23
: day7 79 64
作者: nsay (心亂不已。停留著)   2023-02-01 18:59:00
(筆記
作者: ninifs (快快樂樂過每天 !)   2023-02-11 21:34:00
謝謝大大的教學非常感謝

Links booklink

Contact Us: admin [ a t ] ucptt.com