日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle行列转换关联union的方式_几行代码轻松玩转 Excel 行列转换

發布時間:2023/12/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle行列转换关联union的方式_几行代码轻松玩转 Excel 行列转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

幾行代碼輕松玩轉 Excel 行列轉換

下面這種交叉式的 Excel 表是很常見的格式,用來填寫和查看都比較方便:

但是,如果想做進一步的統計分析,這種格式就不方便了,需要行列轉換,變成如下格式的明細表:

顯然,手工操作會非常麻煩,若數據量小還可以,數據量大了會耗費大量時間,簡直就是災難。

Excel 也可以通過數據透視表支持行列轉換功能,效果如下圖:

但這并不是我們想要的格式。

看來只能寫個程序來解決了,思路也很簡單:

  • 加載 excel 文件,裝載需要的 sheet 工作表。
  • 讀取賬套名所在的行,將其轉換成字符串數組。
  • 讀取科目編碼所在列,將其轉換成字符串數組。
  • 按科目編碼分組,與賬套名數組構造一張表。
  • 根據賬套名對應的數據,遍歷所有的明細值填充到相應的表中。
  • 這樣就構造出對應的明細表來。

如果用 Java 來實現,初步估計代碼量也不會少于 200 行,若需要結果輸出成 excel 文件則開發工作量會更多。Excel 自己雖然提供了 VBA,但那個麻煩度誰用誰知道,不提也罷。其它的語言呢?傳說 python 有處理行列轉換的功能(pandas 包里有 pivot 功能),代碼量相對于 java 會少很多, 我們來試一下:

import pandas as pd

import numpy as np

df = pd.read_excel(“D:excelpandas.xlsx”, 0, 3)

cols = df.columns.values.tolist() #獲取數據頭信息

#移去前兩列,只保留需要行列轉換的列

cols.remove(‘科目編碼’)

cols.remove(‘科目明細’)

#構造一個 list.

frames=[]

for col in cols:

df1 = df.pivot_table(index = [‘科目編碼’,’科目明細’], values = [col])

df1.rename(columns={col: ‘數值’}, inplace=True)

df1[3]=col

#轉換后的數據追加到 frames 中.

frames.append(df1)

# concat 將相同字段的表首尾相接

result=pd.concat(frames)

result.rename(columns={3: ‘帳套名’}, inplace=True)

result.to_excel(‘D:excelpandas_n.xlsx’, sheet_name=’科目明細’)

嗯,還不錯,果然比較簡潔!這是 Python 生成的 excel 文件:

不過,這里有點小問題,這個 excel 格式有點特殊,想用 Python 的 pivot,我們要將“科目編碼”,“科目明細”移到與轉換列標題所在同一行上,變成下面的樣子。否則在代碼上就得特殊 “照顧”,反正只有一行,手工做一下就算了,比寫代碼省事。

無論如何,python 的這個細節處理的小”瑕疵”并不影響其方便性。python 確實名不虛傳,雖然使用了循環,但整個代碼也就只有 10 來行的樣子。

還能更簡單嗎?

嘿嘿,能!

我們來看集算器的代碼:

代碼很簡單,我們把每一步的中間結果列出來看看:

A1:加載 excel 文件工作表 1,提取指定范圍的數據 (從 3 行到 40 行),其中選項 @ t 表示首行為標題,載入數據, 生成表格如下:

A2:刪除非數據行

A3:更換列名稱

A4:把從第三列開始的列名稱連成字符串,用“,”分開

A5:pivot 函數將行列數據進行轉換,把 A4 中對應的列數據置放到“數值”列

A6:將整理好的數據另存儲為 xls 文件

集算器腳本只 6 行,而且木有啥循環、判斷之類的玩意兒,也不像 Python 那樣要先手工倒騰一下,就把這看似有點“亂”的數據表格處理好了。相比之下,Python 采用列優先轉換多次循環 “N”字方式,集算器則用行優先一次性處理,在處理數據上,集算器對細節處理及使用習慣更專業。而且集算器的開發環境也容易調試,可以看到每一步運算的中間結果,方便挑出錯誤,開發更為便捷。在這種常規數據處理的任務中,集算器要比 Python 更為優越。

就這個問題,關于 python 與集算器的差異,再說說自己的一點體會:

1. 多列轉換:

對于需要多列行列轉換并匯集成“長”列的場景時,python 需要將每個數據列構造成數組,并增加一列記錄當前列名,再追加到一個大的列表中,最后合并,合并中去掉非首個數組中的 title;

集算器就容易些,它直接把想要轉換的列匯集在一塊就行。相對于 python 的繁瑣,集算器至少能省幾個腦細胞。

2. 名稱更改:

python 對于需要轉換列的名稱不能更改, 如 cols[0]=’天津’,此時 python 找不到修改前的關鍵字,“哪個朋友挖的坑,別以為我發現不了”,欺負大爺眼花,給報個異常行不?

但對應的集算器來說則很方便, 如:>A1.rename(_1: 科目編碼,_2: 科目明細,4 成都: 成都)

3. 標題空值問題:

Python 讀取 excel 表中的轉換行標題時,前面兩列為空 (對應原來的 excel 中的“科目編碼,科目明細”),此時標題 cols 中的空值就沒有了, 這個“坑”有點隱蔽啊,我真沒有發現, 把其中的兩列弄丟了,真有點丟臉 ;

但集算器能識別出來,會自動加上對應的標識 _1、_2,這樣處理數據時,就能找到其中對應的兩列。

4. 網格式編程

集算器使用網格 A1 這種格式,它自動與所在位置的對象關聯起來,這點非常方便, 感覺很有特色;Python 就只能望洋興嘆了。

總結

以上是生活随笔為你收集整理的oracle行列转换关联union的方式_几行代码轻松玩转 Excel 行列转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。