zoukankan      html  css  js  c++  java
  • 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:Users1Desktop工作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:Users1Desktop工作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:Users1Desktop工作202106练习文件"
    
    path1 = r"C:Users1Desktop工作202106save"
    
    # 当前时间格式,很有用。
    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)
    

      

  • 相关阅读:
    linux平台下Hadoop下载、安装、配置
    C#实现单例,保证线程安全
    编写response生成图片验证码时,报import com.sun.image.codec.jpeg.JPEGCodec;
    Java中static是什么意思,有什么作用?
    使用内部类和闭包
    在数据结构中存储对象
    Java学习——响应用户输入
    提升代码质量——结构化编程
    各种排序总结(六)归并排序
    各种排序总结(五)快速排序
  • 原文地址:https://www.cnblogs.com/sakura3/p/14875037.html
Copyright © 2011-2022 走看看