pandas 列轉行處理


問題:數據格式這個樣子

 

 

 

處理成: 

 

 

 

 

這個剛開始給我確實造成了不少困擾,公司的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)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM