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

      效果:

          

  • 相关阅读:
    xshell+xftp破解版下载安装以及使用教程
    XFTP安装和Xshell配置
    spark-shell的Scala的一些方法详解
    Xshell连接Linux系统
    虚拟机的使用克隆及网络配置
    dochub批量上传教程
    可汗儿童版kids安卓版下载安装教程
    2020年MySQL数据库面试题总结(50道题含答案解析)
    什么是a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站…z站?
    ApacheCN JavaWeb 译文集 20211017 更新
  • 原文地址:https://www.cnblogs.com/Mr-Simple001/p/14142334.html
Copyright © 2020-2023  润新知