1. 程式人生 > 其它 >12.pandas將二維陣列寫入excel中

12.pandas將二維陣列寫入excel中

  1 # encoding:utf-8
  2 
  3 import pandas as pd
  4 from openpyxl import load_workbook
  5 
  6 '''
  7 本案例獲取所有符合的列資料
  8 去除了每個欄位的空格
  9 去除了空行資料
 10 去除了第一列為空的整行資料
 11 多個sheet
 12 
 13 對多個sheet資料整合在一個sheet中
 14 
 15 對整合在一個sheet中的資料只獲取想要的列
 16 
 17 獲取對應行對應列的資料寫到excel中
 18 即第一列與後面每一列一一對應放入到新的一行中
 19 組成一個2維陣列,寫入倒新的EXCEL中
20 ''' 21 22 class OpenMyXLS(): 23 def __init__(self, filepath): 24 self.filepath = filepath 25 self.openxls() 26 27 def openxls(self): 28 '''獲取第一個sheet的資料''' 29 df = pd.read_excel(self.filepath, sheet_name=0) 30 '''獲取行數列數''' 31 hanglie = df.shape
32 hang = hanglie[0] 33 lie = hanglie[1] 34 print(hanglie) 35 36 '''將第i行第j列的值加到excel中,組成只有兩列的資料''' 37 tofilepath = "../HSGtotest81_zh2_dange.xlsx" 38 result2 = self.get8170lists(df, hang, lie) 39 self.writerexcel(tofilepath,result2) 40 41
'''將二維資料寫入excel中''' 42 def writerexcel(self, tofilepath, result2): 43 writer = pd.ExcelWriter(tofilepath) 44 df = pd.DataFrame(result2) 45 df.to_excel(writer, sheet_name="allhsgmlb", index=False) 46 writer.save() 47 writer.close() 48 49 '''獲取81跟70配對,組合成2維陣列''' 50 def get8170lists(self, df, hang, lie): 51 n = 0 52 m = 1 53 h_list = [] 54 h_lists = [] 55 while n < hang: 56 while m < lie: 57 valueij = df.values[n, 0] 58 h_list.append(valueij) 59 60 valueij = df.values[n, m] 61 h_list.append(valueij) 62 # print(h_list) 63 64 h_lists.append(h_list) 65 print(h_lists) 66 h_list = [] 67 m += 1 68 n += 1 69 m = 1 70 return h_lists 71 72 '''獲取excel中所有sheet的名稱''' 73 def getSheetNames(self, filepath): 74 df = pd.read_excel(filepath, sheet_name=None) 75 print("所有的sheet名稱:") 76 sheetNameList = list(df) 77 return sheetNameList 78 79 '''根據sheet名稱獲取對應列名的資料,寫入新的excel中''' 80 def foundtopnamedata(self, sheetNameList, file1): 81 k = 0 82 writer = pd.ExcelWriter(file1) 83 while k < len(sheetNameList): 84 sheetName = sheetNameList[k] 85 print(sheetName) 86 df = pd.read_excel(self.filepath, sheet_name=sheetName) 87 print("獲取表頭") 88 topNames = (df.keys()).values 89 print(topNames) 90 print("查詢是否有81BOM列") 91 findArr = self.returnFiindHSG(topNames) 92 # findArr = self.returnFiindMLB(topNames) 93 print("整合後的表頭資料") 94 print(findArr) 95 96 if findArr: 97 print("獲取對應列的所有資料") 98 d = self.returnDict(findArr, df) 99 todf = pd.DataFrame(d) 100 print("刪除空行") 101 todf = todf.dropna(how='all') 102 print("刪除81BOM列中有nan的行") 103 todf = todf.dropna(subset='81BOM') 104 todf.to_excel(writer, sheet_name=sheetName, index=False) 105 else: 106 print("沒有找到想要的列表頭") 107 k += 1 108 writer.save() 109 writer.close() 110 print("建立excel OK!!!") 111 112 '''整合所有sheet放在第一個sheet中''' 113 def zhengheALLsheet(self, readfilepath, tofilepath1, tofilepath2): 114 writer1 = pd.ExcelWriter(tofilepath1) 115 writer2 = pd.ExcelWriter(tofilepath2) 116 117 sheetNameList = self.getSheetNames(readfilepath) 118 print(len(sheetNameList)) 119 120 k = 0 121 frames = [] 122 while k < len(sheetNameList): 123 sheetName = sheetNameList[k] 124 print(sheetName) 125 df1 = pd.read_excel(readfilepath, sheet_name=sheetName) 126 #print(df1) 127 frames.append(df1) 128 k += 1 129 print(frames) 130 131 result1 = pd.concat(frames, keys=sheetNameList) 132 result1.to_excel(writer1, sheet_name="allhsgmlb") 133 writer1.save() 134 writer1.close() 135 136 result2 = pd.concat(frames) 137 result2.to_excel(writer2, sheet_name="allhsgmlb", index=False) 138 writer2.save() 139 writer2.close() 140 print("資料整合到一個sheet中成功!") 141 142 '''去除重複行的資料''' 143 def qcfxls(self, readfilepath, sheetNameList, tofilepath): 144 writer = pd.ExcelWriter(tofilepath) 145 # 讀取excel中的資料 146 j = 0 147 while j < len(sheetNameList): 148 sheetName = sheetNameList[j] 149 data = pd.DataFrame(pd.read_excel(readfilepath, sheetName)) 150 # 檢視獲取的資料 151 #print(data) 152 # 檢視去除重複行的資料 153 no_re_row = data.drop_duplicates() 154 print(no_re_row) 155 # 將去除重複行的資料輸出到excel表中 156 no_re_row.to_excel(writer, sheet_name=sheetName, index=False) 157 j +=1 158 writer.save() 159 writer.close() 160 print("去除重複資料OK") 161 162 '''返回插入EXCEL資料的字典形式''' 163 def returnDict(self, findArr, df): 164 i = 0 165 d = {} 166 while i < len(findArr): 167 allData1 = df.loc[:, findArr[i]].values 168 allData1a = self.qukongge(allData1) 169 d[findArr[i]] = allData1a 170 i += 1 171 return d 172 173 '''返回符合要求的表頭''' 174 def returnFiindMLB(self, topNames): 175 findArr = [] 176 for topName in topNames: 177 if topName == '81BOM': 178 findArr.append(topName) 179 print(findArr) 180 if '70 MLB Bin' in topName: 181 findArr.append(topName) 182 print(findArr) 183 return findArr 184 185 '''返回符合要求的表頭''' 186 def returnFiindHSG(self, topNames): 187 findArr = [] 188 for topName in topNames: 189 if topName == '81BOM': 190 findArr.append(topName) 191 print(findArr) 192 if '70 HSG Bin' in topName: 193 findArr.append(topName) 194 print(findArr) 195 return findArr 196 197 '''返回符合要求的表頭''' 198 def returnFiindAll(self, topNames): 199 findArr = [] 200 for topName in topNames: 201 if topName == '81BOM': 202 findArr.append(topName) 203 print(findArr) 204 if '70 HSG Bin' in topName: 205 findArr.append(topName) 206 print(findArr) 207 if '70 MLB Bin' in topName: 208 findArr.append(topName) 209 print(findArr) 210 return findArr 211 212 '''去取字串左右空格''' 213 def qukongge(self, lieDatas): 214 allData_strip = [] 215 for allData in lieDatas: 216 if isinstance(allData, str): 217 # print(allData.strip()) 218 allData_strip.append(allData.strip()) 219 else: 220 # print(allData) 221 allData_strip.append(allData) 222 return allData_strip 223 224 225 if __name__ == '__main__': 226 filepath = '../HSGtotest81_zh2.xlsx' 227 oxl = OpenMyXLS(filepath)