python3处理excel【三方库—pandas库】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、pandas是什么?

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、使用步骤

  • 数据分析使用,pandas三方库,安装pip install pandas
  • excel表格数据样式设置,openpyxl三方库,安装pip install openpyxl
  • pandas api 可以查看博客:https://blog.csdn.net/weixin_45069552/article/details/109671383
    openpyxl使用指导:https://blog.csdn.net/qq_40494873/article/details/119790933

    1. python 中的数组

    pandas中数据为DataFrame,基于二维数组初始化DataFrame,所以先链接数组
    代python中数组定义,dataFrame可以基于二位数组初始化:

    import pandas as pd
    import numpy as np
    import os
    
    def define_arrary():
        '''
        数组定义
        '''
        arrary_single = np.random.randn(3) # <class 'numpy.ndarray'
        print(arrary_single)
        arrary_double = np.random.randn(3, 6) # <class 'numpy.ndarray'
        print(arrary_double) #二维数组
        print("*"*100)
        arrary_three = np.random.randn(3, 6, 2) #三维数组
        print(arrary_three)
        print("-"*100)
    

    数组与列表的转换:

    import pandas as pd
    import numpy as np
    import os
    
    def list_and_arrary():
        '''
        list 与 arrary 相互转换
        '''
        li_list = [i for i in range(10)] #<class 'list'>
        print(li_list)# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
        ##列表转换为 数组
        list_to_arrary = np.array(li_list) #<class 'numpy.ndarray'>
        print(list_to_arrary)#[0 1 2 3 4 5 6 7 8 9]
    
        ##数组转换为列表
        arrary_single = np.random.randn(3)
        array_to_list = arrary_single.tolist() #<class 'list'>
        print(array_to_list)
    
        arrary_double = np.random.randn(3, 6)
        array_to_list = arrary_double.tolist()
        print(array_to_list)
    

    2.python中Series数据类型

    定义series数据类型,series实际是带索引的一维数组
    定义pd.Series:

    import pandas as pd
    import numpy as np
    import os
    
    def define_series():
        '''
        定义series数据类型,series实际是带索引的一维数组
        '''
        data = [1, 2, 3, 4]
        seri = pd.Series(data=data, index=['class1', 'class2', 'class3', 'class4'])
        print(seri) #带索引的一维数组
        '''
        class1    1
        class2    2
        class3    3
        class4    4
        '''
        seri = pd.Series(data=data) #若不指定index,则默认从0开始
        print(seri)
    

    列表与pd.Series之间转换:

    import pandas as pd
    import numpy as np
    import os
    
    def list_and_series():
        '''
        list 与 series 相互转换
        '''
        series = pd.Series([i for i in range(4)], index=['student1', 'student2', 'student3', 'student4']) # list to series
        print(type(series)) #<class 'pandas.core.series.Series'>
    
        list_se = series.to_list() # series直接转换为list
        print(type(list_se)) #<class 'list'>
        print(list_se) #return [0, 1, 2, 3]
    
        arrary_se = series.values #series 转换为array
        print(type(arrary_se))# <class 'numpy.ndarray'>
        print(arrary_se)#return [0 1 2 3]
        print(arrary_se.tolist()) #array转换为 list,return [0, 1, 2, 3]
    

    3. pandas中数据结构 DataFrame

    DataFrame中几种实例化方法:

    import pandas as pd
    import numpy as np
    import os
    
    def define_dataFrame():
        '''定义如下DataFrame,有三种定义方法:
        第一种:data = 二维数组
        第二种:data = [{列名:值},{列名:值}],此种方法{}中key为列名;{列名:{行名,值}, 列名:{行名,值}}
        第三种:data = [Series1, Series2,],此种方法Series中index为列名
        
                    student1  student2  student3  student4
        class1        10        20        30        40
        class2        10        20        30        40
    
        其他: Series.to_frame(name),此种方法将Series直接转换为DataFrame,其中Series中index为行名,name为列名 
                class1
        student1      10
        student2      20
        student3      30
        student4      40
        '''
        ###定义dataFrame:通过数组定义
        data = np.random.randn(2,4) # 2 x 4 数组/矩阵
        columns = ['student1', 'student2', 'student3', 'student4'] # 列名
        index = ['class1', 'class2'] #行名
        df = pd.DataFrame(data=data, columns=columns, index=index)
        print(df)
        df = pd.DataFrame(data=data) #若不指定columns、index,则默认0,1,2,3
        print(df)
    
        ###定义dataFrame:通过字典定义,其中字典的key为列名
        data_list_dict = [{'student1':1, 'student2':2, 'student3':3, 'student4':4},
        {'student1':10, 'student2':20, 'student3':30, 'student4':40}
        ]
        df = pd.DataFrame(data=data_list_dict, index=['class1', 'class2'])
        print(df)
        df = pd.DataFrame(data_list_dict)
        print(df)
        ###定义dataFrame:通过完整的dict
        data_dict = {'student1':{'class1':10, 'class2':10}, 
        'student2':{'class1':20, 'class2':20},
        'student3':{'class1':30, 'class2':30},
        'student4':{'class1':40, 'class2':40}
        }
        df = pd.DataFrame(data=data_dict)
        print("*"*200)
        print(df)
        print("*"*200)
    
    
        ##定义DataFrame:通过Series定义,其中series中index为列名称,与dict一样
        print('-'*100)
        series_list = []
        seri = pd.Series(data=[10,20,30,40], index=['student1', 'student2', 'student3', 'student4'])
        print(seri)
        for i in range(2):
            series_list.append(seri)
        df = pd.DataFrame(data=series_list, index=['class1', 'class2'])
        print(df)
    
        ##直接通过Series可以之间转换为DataFrame
        seri_dataframe = seri.to_frame(name='class1') #此种方法,其中series中index为行名称, name为列名字
        print(seri_dataframe)
        print(type(seri_dataframe)) #return <class 'pandas.core.frame.DataFrame'>
        '''
                class1
        student1      10
        student2      20
        student3      30
        student4      40
        '''
    

    DataFrame中Merge, Join,Concat,用于表格数据合并:
    可以查看博客:https://blog.csdn.net/ai_XX/article/details/100084617
    也可以查看博客:https://segmentfault.com/a/1190000018537597

    import pandas as pd
    import numpy as np
    import os
    
    def caculate_dataFrame():
        '''
        该函数用于列表的数据合并
        Merge, Join,Concat方法详解:https://segmentfault.com/a/1190000018537597
        '''
        columns_head = ['student1', 'student2', 'student3', 'student4']
        df = pd.DataFrame(np.random.rand(2,4), columns=columns_head)
        print(df)
        print("*"*200)
        df1 = pd.DataFrame(np.random.randn(4,2), columns=['student1', 'student3'])
        print(df1)
        print("*"*200)
        df2 = pd.DataFrame(np.random.randn(3,2), columns=['student5', 'student6'])
        print(df2)
        print("*"*200)
        '''
        #axis代表横向、还是纵向拼接: axis=0 ,行拼接;axis=1, 列拼接; 默认为axis=0,行拼接
        #join代表内连接,还是外连接:join=outer,外连接; join=inner,内连接; 默认为join=outer,外连接
        #外连接、内连接,可以联想并集、交集
        '''
        print(pd.concat([df, df1, df2], axis=0, join='outer'))
        print(pd.concat([df, df1, df2], axis=1, join='outer')) # 
        print(pd.concat([df, df1, df2], axis=1, join='inner')) #内连接,获取所有非空的数据
    
    

    4. pandas操作excel表格

    新建excel表格(示例):

    import pandas as pd
    import numpy as np
    import os
    
    def writer_dataFrame_data_to_excel():
        '''
        将dataFrame数据写入excel表格
        sheet_name: 指定sheet名称;header:是否插入标题;index: 是否插入行索引
        startrow:指定数据插入行位置,从0开始 
        startcol:指定数据插入列位置,从0开始
        '''
        data = np.random.randn(2,4) # 2 x 4 数组/矩阵
        columns = ['student1', 'student2', 'student3', 'student4'] # 列名
        index = ['class1', 'class2'] #行名
        df = pd.DataFrame(data=data, columns=columns, index=index)
    
        ###新建表格,插入数据
        out_excel = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'source/out.xlsx')
        try:
            writer = pd.ExcelWriter(out_excel, engine='openpyxl')
            df.to_excel(writer, sheet_name='student', header=True, index=True, startrow=0, startcol=0)
            writer.save()
        except Exception as e:
            print(e)
        print("create excel successful!")
    

    excel中追加数据:

    import pandas as pd
    import numpy as np
    import os
    
    def append_dataFrame_data_to_excel():
        '''
        该方法用来向已有的表格追加数据:
        两种实现思路:
        一、将原始表格的数据读出来,然后和追加的数据合并,一次性重新插入全部数据;读写影响性能
        二、读取原始表格已有数据位置,在后面直接追加新的数据;最理想的方法,读写性能优。
    
        但是pandas插入数据的方法pd.to_excel(),这个方法缺少了一个类似pd.to_csv()中的mode参数,可以实现数据追加,
        以至于每次写入数据都会覆盖原始数据,所以当前pandas我们只能使用第一种思路。
        '''
        out_excel = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'source/out.xlsx')
        df_origin = pd.read_excel(out_excel, engine='openpyxl')
        print(df_origin)
        
        df_origin_data = df_origin.iloc[:, 1:] #切片,提出第一列数据
        head_colomns = df_origin_data.columns
    
        ##向原来的sheet页面中追加数据,求中: mode默认为 w    
        df_append = pd.DataFrame(data=np.random.randn(8,4),columns=head_colomns)
        print(df_append)
        df = pd.concat([df_origin_data, df_append], join='outer', ignore_index=True) #ignore_index,重新设置index
        print(df)
        with pd.ExcelWriter(out_excel, engine='openpyxl') as writer:
            df.to_excel(writer)
            writer.save()
        
        #pd.ExcelWriter方法默认是xlsxwriter,但是xlsxwriter不支持append操作, 指定openpyxl;
        #mode=a 则会新增一个sheet页面,而非在原始sheet页后追加数据
        with pd.ExcelWriter(out_excel, engine='openpyxl', mode='a') as writer:
            df_origin.to_excel(writer, sheet_name='Sheet1')
            writer.save()
    

    读取excel表格中的数据&DataFrame中切片操作:
    iloc方法,根据行、列序号获取数据

  • 据行列号选取:df.iloc[[行号],[列号]];例如:df.iloc[[0,3],[2,4]]
  • 根据行列号切片:df.iloc[[行号],[列号]];例如:df.iloc[0:2,1:3]、df.iloc[0::2,1:3:1]
  • loc方法,根据行、列序名称获取数据

  • 根据行列名选取:df.loc[[行名称],[列名称]];例如:df.loc[[2,3],['student1','student3']]
  • 根据行列名称切片:df.iloc[[行名称],[列名称]];例如:df.loc[0:1,'student1':'student3']
  • filter方法,根据行、列名获取数据

  • 根据列名选取:df.filter(items=['列名', '列名']);例如:df.filter(items=['student1', 'student3'])
  • 根据行名选取:df.filter(items=['行名', '行名'],axis=0);例如:df.filter(items=[2,3], axis=0))
  • import pandas as pd
    import numpy as np
    import os
    
    def read_dataFrame_data_from_excel():
        '''
        读取excel表格数据
        '''
        out_excel = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'source/out.xlsx')
        reader_df = pd.read_excel(out_excel)
        print(reader_df)
        print(reader_df.values) # dataFrame转换为数组
        print(np.array(reader_df)) #dataFrame转换为数组
    
        print(reader_df.to_dict()) #dataFrame 转换为字典
        print(reader_df.to_json()) #dataFrame 转换为json
    
        print(reader_df.iloc[[0,3],[2,4]]) #根据行列号选取
        print(reader_df.iloc[0:2,1:3]) #根据行列号切片
        print(reader_df.iloc[0::2,1:3:1]) #根据行列号切片,可以指定补长
    
        print(reader_df.loc[[2,3],['student1','student3']]) #根据行列名选取
        print(reader_df.loc[0:1,'student1':'student3']) #根据行列名称切片
    
        print(reader_df.filter(items=['student1', 'student3'])) #获取列
        print(reader_df.filter(items=[2,3], axis=0)) #获取行
    

    5.pandas操作csv文件

    pandas操作csv,可以指定mode=‘w’/‘a’。可以实现数据追加
    代码如下(示例):

    import pandas as pd
    import numpy as np
    import os
    
    def new_and_append_data_to_csv():
        '''
        该函数演示pandas中对CSV的操作:创建csv文件、追加数据,读取数据等
        csv:和普通文件类似,通过指定mode来实现csv文件数据的新建,追加等操作
        '''
        df = pd.DataFrame(data=np.random.randn(8,4), columns=['student1', 'student2','student3','student4'])
        out_csv = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'source/out.csv')
        df.to_csv(out_csv, mode='w') 
    
        df1 = df.copy()
        df1.to_csv(out_csv,mode='a', header=False)
        print("update csv successful!")
    
        df_reader = pd.read_csv(out_csv)
        print(df_reader)
        print(df_reader.shape) # (16, 5), (行数,列数)
        print(df_reader.index) # RangeIndex(start=0, stop=16, step=1),行标签
        print(df_reader.columns) #Index(['Unnamed: 0', 'student1', 'student2', 'student3', 'student4'], dtype='object')
    
        print(df_reader.head()) #获取头部几条数据,默认5条
        print(df_reader.tail(2)) #获取尾部几条数据,默认5条
    
        ##3 在这里暂时不介绍关于csv数据 大数据读取,分块读取
    

    # 总结 提示:这里对文章进行总结: 例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值