問題:數據格式這個樣子
處理成:
這個剛開始給我確實造成了不少困擾,公司的SB 系統。 不給數據庫的編輯權限。數據權限保密,本來很簡單的事,搞復雜化了。 沒辦法,我只有手動寫下,處理下本地excel 。不給自己添加工作量。 我一開始沒想好這么寫,還好有個人博主挺秀的。 寫的差不多。
https://www.cnblogs.com/traditional/p/11967360.html
首先通過melt 函數,實現列轉行。
melt里面的幾個參數:
frame: 第一個參數, 接收一個DataFrame, 這沒有什么好說的
id_vars: 第二個參數, 不需要進行列轉行的字段,
value_vars: 第三個參數, 需要進行列轉行的字段
var_name: 第四個參數, 我們說列轉行之后會生成兩個列, 第一個列存儲的值是"列轉行之前的列的列名",第二個列存儲的值是"列轉行之前的列的值"。但是生成的兩個列總要有列名吧,所以var_name就是生成的第一個列的列名
value_name: 生成的第二個列的列名
col_level: 針對於具有二級列名的DataFrame, 這個一般可以不用管
# _*_coding:utf-8 _*_ import pandas as pd import numpy as np # import os # import time path = r"C:\Users\1\Desktop\工作\202106\練習文件\處理數據.xlsx" data = pd.read_excel(path) data1= pd.melt(data,id_vars=['日期'],var_name="城市維度", value_name="數值") print(data1)
處理后結果
2 接着分列處理。
# 總算對了,設置兩級索引。這樣就不會變 data1 = data1.set_index(['日期','數值'] )["城市維度"].str.split("-", expand=True) print(data1)
設置索引之后不會變更,然后根據城市拆分。
3 重置索引
data2 = data1.reset_index() print(data2) data2 = data2.set_index(['日期',0,1]) print(data2)
處理結果。
接下來就很簡單了,我只需要把這個行銷售額,銷售件數,給變成列就歐克,
4 行轉列
data4 = data2.unstack() print(data4) data4= data4.reset_index().rename_axis() print(data4) data4.to_excel(r"C:\Users\1\Desktop\工作\202106\練習文件\處理數據123.xlsx")
最后結果,得到我們想要的。
參考鏈接:https://www.cnblogs.com/traditional/p/11967360.html
不常用,就隨便寫了。沒有很好的規范。寫成類什么的。
其中遇到最多的卡點,居然是保存文件,格式,各種報錯。然后就是時間,總不能每次手改趴。 還好解決了。節約時間。
完整代碼:
# _*_coding:utf-8 _*_ import pandas as pd import numpy as np import os import time # 這個可以寫成一個類,保存文件,獲取文件的初始化類。 path = r"C:\Users\1\Desktop\工作\202106\練習文件" path1 = r"C:\Users\1\Desktop\工作\202106\save" # 當前時間格式,很有用。 tim = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time())) filenames = os.listdir(path) df = pd.DataFrame() for i in filenames: # print (path + '\\'+ i ) -- 驗證地址 data = pd.read_excel(path + '\\' + i) df = df.append(data) data1 = pd.melt(df, id_vars=['日期'], var_name="城市維度", value_name="數值") # 總算對了,設置兩級索引。這樣就不會變。 設置索引 。固定日期和值 data1 = data1.set_index(['日期', '數值']) # 根據字符切割,故意寫開 。其實可以這樣寫 data1 = data1.set_index(['日期', '數值'])["城市維度"].str.split("-", expand=True) data1 = data1["城市維度"].str.split("-", expand=True) # 重置索引,四個都有索引,列轉行了。 data2 = data1.reset_index() # 再度設置索引,需要將指標行轉列。 data2 = data2.set_index(['日期', 0, 1]) # 行轉列,使用unstack方法。默認是最后一列變為列。 最后一列是指標 。 # 這里的level默認是-1, 表示將最后一級的索引變成列 # # 這里我們不用指定(注意: 索引從0開始), 告訴pandas, 把第一級索引變成列 data4 = data2.unstack() # 重置索引 data4 = data4.reset_index().rename_axis() # 地址 addres = path1 + '\\' + 'x' + tim + '.xlsx' print(addres) data4.to_excel(addres)