zoukankan      html  css  js  c++  java
  • pandas处理excel的常用方法技巧(上)

    1. 导库

    import pandas as pd
    

    2. 读取excel文件

    这里要注意的就是第二个参数header如果不设置,pandas会默认把excel的第一行当作columns,header=None的时候pandas会为我们新生成从0开始的数字做columns, 我们可以通过header=1把第二行当作columns;第三个参数index_col是表示用哪一列做index的,如果不设置的话,pandas会默认生成一串从0开始的数字当作index,我们可以设置指定列来当作index,例如index_col=“id”.
    如果出现数据没在excel表格的左上角,可以使用skiprows参数来略过行,也可以使用usecols="F:H"来决定从第几列开始读取
    可以使用sheet_name=参数决定读取第几个sheet

    df = pd.read_excel('d:/用户信息.xlsx', header=1, index_col='id')
    
    df = pd.read_excee('d:/books.xlsx', skiprows=3, usecols="G:L")
    

    3. 读取一个对象的头和尾

    我们可以通过head()方法和tail()方法来读取头和尾,不设置参数默认读5行,可以设置int类型参数来决定我们读多少行。

    df.head()  # 读前五行
    df.head(7)  # 读前七行
    
    df.tail()  # 读后五行
    df.tail(3)  # 读后三行
    

    4. 为对象设置columns

    通过修改对象的columns属性就相当于重新为对象设置了columns

    df.columns = ['订单id', '用户id', '订单状态']
    

    5. 为对象设置index

    我们可以通过set_index()方法设置index, 如我们可以把订单id这一列设置为index,但是要注意的是设置之后,订单id将不再出现在df.columns属性中了,会变成index的name;第二个参数inplace就地修改,可以设置为True和False.

    df.set_index('订单id', inplace=True)
    

    5. 写入文件保存

    可以通过to_excel()方法保存到本地.

    df.to_excel('d:/user_id.xlsx')
    

    6. pandas中表格的行和列

    在一个二维表格中,一行或者一列我们都可以用Series对象来表示。一个Series是当作行还是当作列,完全是由我们加入的方法决定的。

    7. Series简介和Series属性

    Series的结构和字典的结构很相似,不过在Series中不叫keys了,叫index;
    Series的属性有index, name, value, data(快要移除了), 还有其他不常用属性可以到pycharm中一个点全出来了.

    8. Series创建

    创建一个空的Series:

    s1 = pd.Series()
    

    从字典生成,字典的key是这里的index

    d = {'x':100, 'y':200, 'z':300}
    s2 = pd.Series(d)
    

    从列表生成,这时候需要两个列表, 一个用作value,一个用作index

    lst1 = [100, 200, 300]  # 当作value
    lst2 = ['a', 'b', 'c']  # 当作index
    s3 = pd.Series(lst1, index=lst2)
    

    9. 用Series来构造DataFrame

    相当于我们用一行一行或者一列一列元素,拼出一个excel表格;
    首先看一下用三个Series对象构造出一个Excel表格的三列,可以用Series的name属性当作列名, index当作每一行的行号;如果index不相同,取index的并集,没有数值的地方给个NaN

    s1 = pd.Series([1, 2, 3], index=[1, 2, 3], name='A')
    s1 = pd.Series([10, 20, 30], index=[1, 2, 3], name='B')
    s1 = pd.Series([100, 200 300], index=[1, 2, 3], name='C')
    
    df = pd.DataFrame({s1.name:s1, s2.name:s2, s3.name:s3})  # 用的最多的方式, 一列一列的
    

    如果不以字典方式构造excel表格的话,直接只用Series序列构造,会出现以Series的name当作行号,一行一行的生成:

    df = pd.DataFrame(s1, s2, s3) # 一行一行的
    

    10. 修改一个值或者修改n个值(自动填充)

    先找到Series再改Series中的元素:

    import pandas as pd
    from datetime import date, timedelta
    def add_month():
        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)
    books = pd.read_excel("d:/book.xlsx", skiprows=3, usecols="C:F", index_col=None,
                            dtype={'name':str, 'id':str, 'date':str})
    for i in books.index:
        if type(books['name'].at[i]) != int:
            books['name'].at[i]
            books['id'] = 'yes' if i & 1 else 'No'
            books['date'].at[i] = add_month(start, i)
    books.set_index("id")
    

    第二种方法是直接在DataFrame中改对应的单元格

    for i in books.index:
        books.at[i, 'date'] = 12
    
    

    11. 函数填充

    需求,在excel表格中,我们可以根据前面几列的数据按照某种函数进行计算,再添加到指定表格中,这里用程序完成:

    books = pd.read_excel('d:/bookss.xlsx', index_col='ID')
    books["Price"] = books["ListPrice"] * books["Discount"]
    print(books)
    

    第二种情况就是DataFrame中的每一列Series有一个apply(function)方法,给function传入一个函数可以对这一Series进行函数处理:

    books = pd.read_excel('d:/bookss.xlsx', index_col='ID')
    books["ListPrice"] = books["ListPrice"].apply(lambda x: x+2)
    

    12. 给数据排序

    使用DataFrame的sort_values()方法进行排序,按照by参数排序, inplace就地, ascending=False是降序;
    如果我们想要先按照某列排序,再按某列排序,by后面可以跟一个列表,ascending也可以给个列表,两种顺序;

    products = pd.read_excel('d:/List.xlsx, index_col='ID')
    products.sort_values(by='Price', inplace=True, ascending=False)
    
    products.sort_values(by=['Worthy', 'Price'], inplace=True, ascending=[True, False])
    

    13. 数据筛选、过滤

    很多时候,我们想要展现的数据,是全体的数据,我们只需要展示其中的一部分
    使用loc属性

    loc属性介绍

    # DataFrame对象有loc属性,loc属性可以通过bool值返回从DataFrame对象中筛选出来的DataFrame对象
    # 先创建一个DataFrame对象
    lst1 = pd.Series(["tom", "jerry", "jacky", "wayne", "justin"])
    lst2 = pd.Series([35, 24, 16, 45, 26])
    lst3 = pd.Series([98, 95, 86, 73, 99])
    
    students = pd.DataFrame({"name":lst1, "age":lst2, "grade":lst3})
    print(students)
         name  age  grade
    0     tom   35     98
    1   jerry   24     95
    2   jacky   16     86
    3   wayne   45     73
    4  justin   26     99
    
    # 定义两个函数来判断成绩是否是优秀,年龄是否年轻, 返回的都是bool值
    def young_age(age):
        return age < 30
    
    def good_grade(grade):
        return grade > 85
        
    # 通过DataFrame对象的apply方法,对students的元素进行判断取bool值,为了不污染原数据,可以使用拷贝
    cp = students.copy()
    cp["grade"] = cp["grade"].apply(good_grade)
    cp["age"] = cp["age"].apply(young_age)
    print(cp)
         name    age  grade
    0     tom  False   True
    1   jerry   True   True
    2   jacky   True   True
    3   wayne  False  False
    4  justin   True   True
    # 这时候我们可以清晰的看到age和grade都已经被判断为了是否是young,是否是good
    
    # 有了这一步,下一步我们就可以用bool在loc属性中进行筛选元素了
    students = students.loc[students["age"].apply(young_age)].loc[students["grade"].apply(good_grade)]]
    这里就清晰的看出来我们两次使用loc属性对数据进行清洗,然后重新赋值给了students变量
    print(students)
         name  age  grade
    1   jerry   24     95
    2   jacky   16     86
    4  justin   26     99
    # 这里就得到了清洗后的数据,即我们要展示的数据,既年轻,成绩又优秀的同学
    

    下面这个同理, 不过students[“age”]和students[“grade”]还可以换成students.age和students.grade来访问对应的列Series:

    import pandas as pd
    
    def age_18_to_30(age):
        return 18 <= age < 30   # 判断一个年龄是否是18到30之间
        
    def level_a(grade):
        return 85 <= grade <= 100  # 判断一个成绩是否是优秀
    
    students = pd.read_excel("d:/students.xlsx", index_col="ID")
    
    students = students.loc[ students["Age"].apply(age_to_30) ].loc[ students["score"].apply(level_a) ]
    
    
  • 相关阅读:
    XML文件的操作说明
    IIS中如何应用程序启用https协议
    sql server中的数据类型转换函数
    sql语句中的join连接(左连接、右连接、全连接、内连接)
    sql语句中日期相减的操作
    C# NameValueCollection集合
    json的两种表示结构(对象和数组).。
    ASP.NET中一般处理程序报的错误:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值
    C#中类的实例是不能 获取到类中的静态方法和静态变量(Static)的,及原因
    《好好学Java 从零基础到项目实战》姗姗而来
  • 原文地址:https://www.cnblogs.com/duanming/p/11830270.html
Copyright © 2011-2022 走看看