亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Excel 行列轉換的最簡方法

發布時間:2020-09-17 10:01:04 來源:網絡 閱讀:998 作者:raqsoft 欄目:大數據

問題描述

??在工作中時常會遇到對 Excel 表格的處理。當編輯一張 Excel 表格時,發現表格的列數太多,而行數較少,為方便打印,這時你或許會希望將該表格行列轉換;或許是為了做進一步做統計分析,當前格式不太方便,這時也會用到行列轉換。

??下面這種交叉式的 Excel 表是很常見的格式,用來填寫和查看都比較方便:
??Excel 行列轉換的最簡方法

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

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

??我們就以此為例,舉例說明幾種常見的解決方法。

解決方法

方法 1:Excel 數據透視表

??Excel 可以通過數據透視表支持行列轉換功能,效果如下圖:
??Excel 行列轉換的最簡方法

??顯然,這并不是我們想要的格式。Excel 的數據透視表可以滿足簡單格式的行列轉換,但如果格式稍微復雜,轉換效果往往是不盡人意。

方法 2:編程語言

??以寫程序來解決,思路也很簡單:

??· 加載 excel 文件,裝載需要的 sheet 工作表。

??· 讀取“賬套名”所在行,將其轉換成字符串數組。

??· 讀取“科目編碼”所在列,將其轉換成字符串數組。

??· 按“科目編碼”分組,與“賬套名”數組構造一張表。

??· 根據“賬套名”對應的數據,遍歷所有的明細值填充到相應的表中。

??· 這樣就可以構造出對應的明細表來。

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

import pandas as pd
    import numpy as np

    df = pd.read_excel("D:\\excel\\pandas.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:\\excel\\pandas_n.xlsx', sheet_name='科目明細')    import pandas as pd    import numpy as np

    df = pd.read_excel("D:\\excel\\pandas.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:\\excel\\pandas_n.xlsx', sheet_name='科目明細')

??效果還不錯,果然比較簡潔!這是 Python 生成的 excel 文件:
??Excel 行列轉換的最簡方法

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

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

??還能更簡單嗎?

??嘿嘿,能!

方法 3:集算器編程

??下面我們來看集算器的代碼:


AB
1=file("D:/excel/ 明細.xlsx").importxls@t(;1,3:40)// 讀入 excel 文件
2>A1.delete(A1.select(_1=="科目編碼"))// 清除首列為“科目編碼”所在的行
3>A1.rename(_1: 科目編碼,_2: 科目明細)// 更換列 1 名稱為科目編碼,列 2 名稱為科目明細
4=A1.fname().to(3,).concat(",")// 將從第 3 列的列名連成字符串,用, 分開
5=A1.pivot@r(科目編碼, 科目明細; 賬套名, 數值;${A4})// 用 pivot 函數進行行列轉換
6=file("D:/excel/ 明細 2.xlsx").exportxls@t(A5;"科目明細")// 將整理好的數據另存儲為 xlsx 文件

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

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

??A2:刪除非數據行
??Excel 行列轉換的最簡方法

??A3:更換列名稱
??Excel 行列轉換的最簡方法

??A4:把從第 3 列開始的列名稱連成字符串,用“,”分開
??Excel 行列轉換的最簡方法

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

??A6:將整理好的數據另存儲為 xlsx 文件
??Excel 行列轉換的最簡方法

??集算器腳本只有 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 就只能望洋興嘆了。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐安县| 正安县| 绩溪县| 通江县| 襄垣县| 伽师县| 大关县| 威海市| 离岛区| 长葛市| 噶尔县| 公主岭市| 平塘县| 孙吴县| 中超| 兴和县| 郎溪县| 成都市| 邵东县| 汝州市| 封丘县| 都匀市| 五华县| 安福县| 涿鹿县| 伽师县| 嘉鱼县| 英山县| 盖州市| 西盟| 秭归县| 鲁山县| 保亭| 全州县| 乌海市| 普安县| 井陉县| 金乡县| 舟曲县| 龙岩市| 高密市|