问题:数据格式这个样子

dataframe某列转成数组 spark dataframe 列转行_列转行

 

 

 

处理成: 

dataframe某列转成数组 spark dataframe 列转行_Desktop_02

 

 

 

 

这个刚开始给我确实造成了不少困扰,公司的SB 系统。 不给数据库的编辑权限。数据权限保密,本来很简单的事,搞复杂化了。 没办法,我只有手动写下,处理下本地excel 。不给自己添加工作量。 我一开始没想好这么写,还好有个人博主挺秀的。 写的差不多。

 

首先通过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)

处理后结果

dataframe某列转成数组 spark dataframe 列转行_列转行_03

 

 

 

2 接着分列处理。

# 总算对了,设置两级索引。这样就不会变
data1 = data1.set_index(['日期','数值'] )["城市维度"].str.split("-", expand=True)

print(data1)

设置索引之后不会变更,然后根据城市拆分。

dataframe某列转成数组 spark dataframe 列转行_Desktop_04

 

 

 3 重置索引

data2 = data1.reset_index()
print(data2)

data2 = data2.set_index(['日期',0,1])
print(data2)

处理结果。

dataframe某列转成数组 spark dataframe 列转行_列转行_05

 

 

接下来就很简单了,我只需要把这个行销售额,销售件数,给变成列就欧克, 

 

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")

 

最后结果,得到我们想要的。

dataframe某列转成数组 spark dataframe 列转行_重置_06

 

 

 

 

不常用,就随便写了。没有很好的规范。写成类什么的。

其中遇到最多的卡点,居然是保存文件,格式,各种报错。然后就是时间,总不能每次手改趴。 还好解决了。节约时间。

完整代码:

# _*_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)