zoukankan      html  css  js  c++  java
  • pandas玩Excel ---小白笔记1,感谢Timothy老师

    一.用pandas创建Excel文件

    1.创建一个空格的Excle文件

    import pandas as pd
    
    df = pd.DataFrame()
    df.to_excel('新建的.xlsx')

    效果:

        

     2.创建一个有内容的Excel文件

    import pandas as pd
    df = pd.DataFrame({"ID":[1,2,3],"Name":["张三","李四","王五"]})
    df.to_excel('新建的.xlsx')

    效果:

      

    3.如果不想要自带的索引,想用自己的ID作为索引,就可以使用一下代码

    import pandas as pd
    df = pd.DataFrame({"ID":[1,2,3],"Name":["张三","李四","王五"]})
    df = df.set_index("ID")
    df.to_excel('新建的.xlsx')

    效果:

      

     二.用pandas打开读取Excel文件

    1.查看Excel的总行列

    import pandas as pd
    exl = pd.read_excel("新建的.xlsx")
    print(exl.shape)

      结果是:(3, 2)  

    2.查看Excel所有的列名

    import pandas as pd
    exl = pd.read_excel("新建的.xlsx")
    print(exl.columns)

      结果是:Index(['ID', 'Name'], dtype='object')

    3.查看Excel前n行数据

    import pandas as pd
    exl = pd.read_excel("新建的.xlsx")
    #默认是5行,可以自己定义,写2只是显示前两行
    print(exl.head(2))

      结果是:

          

     4.查看Excel后n行数据

    import pandas as pd
    exl = pd.read_excel("新建的.xlsx")
    print(exl.tail(1))

      结果是:

          

    5.如果Excel文件是这样子的:

      

      想要从第2行读取,就用header参数,默认是0,可以指定送第n行读取,这里注意,如果第一行是空行,就不需要用header参数指定

    import pandas as pd
    exl = pd.read_excel("新建的.xlsx",header=1)
    print(exl)

      效果是:

           

     6.如果表格没有列头,比如下图,此时就默认是0,1这样子

        

    import pandas as pd
    exl = pd.read_excel("新建的.xlsx",header=None)
    print(exl)

      效果:

          

     7.遇到6这种情况 我们想要设置表头就需要指定设置表头操作,并且不想要默认的索引,用ID代替

    import pandas as pd
    exl = pd.read_excel("新建的.xlsx",header=None)
    exl.columns =["ID","name"]
    exl.set_index("ID",inplace=True)
    print(exl)

      效果:

          

     8.读取文件的时候可以指定索引列

    import pandas as pd
    exl = pd.read_excel("新建的.xlsx",index_col="ID")
    print(exl)

      效果是:

          

     三.pandas的行和列计算

    1.把序列写入excel中,把每个序列看做一列写入

    import pandas as pd
    s1 = pd.Series([1,2,3],index=[1,2,3],name='A')
    s2 = pd.Series([10,20,30],index=[1,2,3],name='B')
    s3 = pd.Series([100,200,300],index=[1,2,3],name='C')
    exl = pd.DataFrame({s1.name:s1,s2.name:s2,s3.name:s3})
    print(exl)

      效果:

          

     2.把序列写入excel中,把每个序列看做一行写入

    import pandas as pd
    s1 = pd.Series([1,2,3],index=[1,2,3],name='A')
    s2 = pd.Series([10,20,30],index=[1,2,3],name='B')
    s3 = pd.Series([100,200,300],index=[1,2,3],name='C')
    exl = pd.DataFrame([s1,s2,s3])
    print(exl)

      效果:

          

     3.s1 = pd.Series([1,2,3],index=[1,2,3],name='A')这里面的index是和pandas里面的index对齐关系,比如:

    import pandas as pd
    s1 = pd.Series([1,2,3],index=[1,2,3],name='A')
    s2 = pd.Series([10,20,30],index=[1,2,3],name='B')
    s3 = pd.Series([100,200,300],index=[1,2,4],name='C')
    exl = pd.DataFrame({s1.name:s1,s2.name:s2,s3.name:s3})
    print(exl)

      效果:

          

     4.pandas 填充Excel

      在pandas里面的每一列其实是一个序列Series。对序列的操作填写就用at函数,下图的数据不是顶格开始写的,读取的时候用skiprows=3,usecols='C:F'来指定读取的开始位置和读取位置usecols也可以写成usecols=“C”,"D","E",“F”,pandas读取Excel的时候如果是空的单元格,默认是浮点类型的。写字符串就会报错,这个时候就需要指定一下指定列的数据类型了。用到的参数是dtype={}字典,来指定

    import pandas as pd
    from datetime import date,timedelta
    case_exl = pd.read_excel("填充.xlsx",skiprows=3,usecols='C:F',dtype={'ID':str,"是否通过":str,"执行日期":str})
    start_data = date(2020,1,1)
    for i in case_exl.index:
        case_exl.ID.at[i]=i+1
        case_exl.是否通过.at[i] = "Yes" if i%2 ==0 else 'NO'
        case_exl.执行日期.at[i] = start_data
    print(case_exl)

      效果:

          

     5.给日期的每一行加1天,只需要循环的时候加 timedelta(days=i)

    import pandas as pd
    from datetime import date,timedelta
    case_exl = pd.read_excel("填充.xlsx",skiprows=3,usecols='C:F',dtype={'ID':str,"是否通过":str,"执行日期":str})
    start_data = date(2020,1,25)
    for i in case_exl.index:
        case_exl.ID.at[i]=i+1
        case_exl.是否通过.at[i] = "Yes" if i%2 ==0 else 'NO'
        case_exl.执行日期.at[i] = start_data+timedelta(days=i)
    print(case_exl)

      效果:

          

     6.给日期的每一行加1年,date(start_data.year+i,start_data.month,start_data.day)

    import pandas as pd
    from datetime import date,timedelta
    case_exl = pd.read_excel("填充.xlsx",skiprows=3,usecols='C:F',dtype={'ID':str,"是否通过":str,"执行日期":str})
    start_data = date(2020,1,25)
    for i in case_exl.index:
        case_exl.ID.at[i]=i+1
        case_exl.是否通过.at[i] = "Yes" if i%2 ==0 else 'NO'
        case_exl.执行日期.at[i] = date(start_data.year+i,start_data.month,start_data.day)
    print(case_exl)

    效果:

          

      7.给日期的每一行加1月,就不能这样写了date(start_data.year,start_data.month+i,start_data.day)

          

       正确的写法是:

    import pandas as pd
    from datetime import date,timedelta
    case_exl = pd.read_excel("填充.xlsx",skiprows=3,usecols='C:F',dtype={'ID':str,"是否通过":str,"执行日期":str})
    start_data = date(2020,10,25)
    #d是给进来的时间,md是要加的月数
    def add_month(d,md):
        yd = md//12
        m =d.month +md%12
        if m!=12:
            yd+=m//12
            m = m%12
        return date(d.year+yd,m,d.day)
    for i in case_exl.index:
        case_exl.ID.at[i]=i+1
        case_exl.是否通过.at[i] = "Yes" if i%2 ==0 else 'NO'
        case_exl.执行日期.at[i] = add_month(start_data,i)
    case_exl.set_index("ID",inplace=True)
    case_exl.to_excel('填充.xlsx')
    print(case_exl)

      效果:

          

     8.以上4,5,6,7,是在序列中来填充数据的,下面直接是直接在DataFrame中填充数据

    # *_*coding:utf-8 *_*
    # @Author : zyb
    import pandas as pd
    from datetime import date,timedelta
    case_exl = pd.read_excel("填充.xlsx",skiprows=3,usecols='C:F',dtype={'ID':str,"是否通过":str,"执行日期":str})
    start_data = date(2020,10,25)
    #d是给进来的时间,md是要加的月数
    def add_month(d,md):
        yd = md//12
        m =d.month +md%12
        if m!=12:
            yd+=m//12
            m = m%12
        return date(d.year+yd,m,d.day)
    for i in case_exl.index:
        case_exl.at[i,"ID"]=i+1
        case_exl.at[i,"是否通过"] = "Yes" if i%2 ==0 else 'NO'
        case_exl.at[i,"执行日期"] = add_month(start_data,i)
    print(type(case_exl))
    case_exl.set_index("ID",inplace=True)
    case_exl.to_excel('填充1.xlsx')
    print(case_exl)

    效果和 7的效果是一样的,写法只是for循环中的小区别

    9.pandas 计算Excel后填充,源文件如下:最后售价 = 价格*折扣

    import pandas as pd
    exl = pd.read_excel('计算.xlsx',index_col="ID")
    exl['最后售价'] = exl.价格*exl.折扣
    exl.to_excel('计算.xlsx')
    print(exl)

      效果:

          

     10.上面的9是整体运算的,效率高,但是有时候需要按照行来计算,就可以这样写:

    import pandas as pd
    exl = pd.read_excel('计算.xlsx',index_col="ID")
    for i in exl.index:
        exl.最后售价.at[i] = exl.价格.at[i]*exl.折扣.at[i]
    print(exl)

      效果同9,可以修改循环次数,决定从那里开始和结束,效率没有9高,但是场景应该比9多

     11.计算某一列还可以调用函数,比如给价格涨5块钱

    import pandas as pd
    exl = pd.read_excel('计算.xlsx',index_col="ID")
    def add_5(x):
    return x+5
    exl['价格'] = exl.价格.apply(add_5)
    # exl.价格 = exl['价格'].apply(add_5)
    # exl.价格 = exl['价格'].apply(lambda x:x+2)
    print(exl)

      效果:

          

     四.pandas对Excel排序,源文件:

    排序使用sort_values函数,by是排序的列名,多个排序是传列表,ascending是正序和倒序,默认是从小到大,多个排序方式用列表传递

     1.按照价格排序

    import pandas as pd
    exl = pd.read_excel('排序.xlsx',index_col="ID")
    exl.sort_values(by='价格',inplace=True)
    print(exl)

      效果:

          

    2.先按照贵不贵排序,在按照价格排序

    import pandas as pd
    exl = pd.read_excel('排序.xlsx',index_col="ID")
    exl.sort_values(by=['贵不贵','价格'],inplace=True,ascending=[False,True])
    print(exl)

      效果:

          

      五.pandas对Excel数据赛选:

    源数据:

     1.看18-28岁 分数是85分以上的信息

    # *_*coding:utf-8 *_*
    # @Author : zyb
    import pandas as pd
    def age_18_to_28(a):
        return 18<=a<28
    def fen_85(s):
        return 85<=s<100
    exl = pd.read_excel('筛选.xlsx',index_col="ID")
    # exl = exl.loc[exl.年龄.apply(age_18_to_28)].loc[exl.分数.apply(fen_85)]
    exl = exl.loc[exl.年龄.apply(lambda a:18<=a<28)].loc[exl.分数.apply(lambda s:85<=s<100)]
    print(exl)

      效果:

          

  • 相关阅读:
    Read-Copy Update Implementation For Non-Cache-Coherent Systems
    10 华电内部文档搜索系统 search04
    10 华电内部文档搜索系统 search05
    lucene4
    10 华电内部文档搜索系统 search01
    01 lucene基础 北风网项目培训 Lucene实践课程 索引
    01 lucene基础 北风网项目培训 Lucene实践课程 系统架构
    01 lucene基础 北风网项目培训 Lucene实践课程 Lucene概述
    第五章 大数据平台与技术 第13讲 NoSQL数据库
    第五章 大数据平台与技术 第12讲 大数据处理平台Spark
  • 原文地址:https://www.cnblogs.com/Mr-Simple001/p/14142334.html
Copyright © 2011-2022 走看看