美文网首页
Pandas 数据添加清洗截取查询

Pandas 数据添加清洗截取查询

作者: Bounty_Hunter | 来源:发表于2019-07-22 14:53 被阅读0次

    Dataframe

    DataFrame 是一种二维的数据结构,非常接近于excel形式。它的竖行称之为columns,横行称之为index,也就是说可以通过 columnsindex 来确定一个元素的位置

    构建dataframe

    pd.dataframe( columns = ('第一列','第二列','第三列') )

    生成空的pandas表

     left = pd.DataFrame({'id':[0,1,2],'name':['Tom','Jack','Mary']})
     right = pd.DataFrame({'id':[0,1,2],'year':[23,34,34],'parent_id':[1,2,4]})
     print(left)
     print(right)
    

    数据添加

    • 在原数据后添加新行

      df.loc['新行名'] = 数据

    • 在原数据后添加新列

      df['新列名'] = 数据

    • 在特定列上添加新列

      df.insert(index, '新列名', 数据)

    数据清洗

    • 有的原始数据中有丢失数据,丢失的时间数据NaT 丢失的数值数据将始终使用NaN,我们在操作数据前需要对数据进行清洗

      • 当对数据求和时,NA(缺失)值将被视为零

        • 如果数据都是NA,则结果将是NA
      • dataframe.isnull()返回一个是否有丢失的数据的矩阵

      • dataframe.isnull().sum()返回每一列有多少个丢失的数据 ※

      • marketing.dropna(axis = 0, how = 'any', thresh=None )

        返回一个去掉所有 NaN 数据的 dataframe ,参数解释:

        • axis

          默认为 axis = 0 或者axis = 'index' 上下方向运算,删除每个包含 NaN(丢失数据)的数据行

          axis = 1 或者 axis = 'columns' 左右方向的运算,删除每个包含 NaN(丢失数据)的数据列

        • how

          默认是 how = 'any' ,如果数据行或列(根据 axis 的值)里有任何一个数据是 NaN() 丢弃这数据行(列)

          how = 'all' ,只有在数据行或列所有的数据都是 NaN 时,才丢弃这数据行(列)

        • thresh

          thresh = n 只保留至少包含 n 个非 NaN 数据的行或列

        • 如果参数没有被修改就会调用默认参数

            # 生成 Dataframe
            df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'],
                               "toy": [np.nan, 'Batmobile', 'Bullwhip'],
                               "born": [pd.NaT, pd.Timestamp("1940-04-25"),
                                       pd.NaT]})
            # 默认清洗函数,按上下方向删除数据(删除行),默认只要有 Na值 的行都删除
            df.dropna()
            print(df)
            # 左右方向删除数据(删除列),(默认)只要有 Na值 的列都删除 
            df.dropna(axis='columns')
            #df.dropna(axis=1)
            print(df)
            # (默认)按上下方向删除数据(删除行),只有在数据行或列所有的数据都是 Na 时,才丢弃这数据行(列)
            df.dropna(how='all')
            print(df)
            #(默认)清洗函数,按上下方向删除数据(删除行),只有有至少两个非 Na值 数据的行才保留
            df.dropna(thresh=2)
            print(df)
            '''
            解释下面的代码
            df.dropna(axis = 0, how = 'any')
            df.dropna(axis = 1, how = 'any')
            df.dropna(axis = 0, how = 'all')
            df.dropna(axis = 1, how = 'all')
            '''
        

    数据截取

    dataframe.iloc[]

    "integer-location based indexing" 切片函数,返回一个 Series

    参数由想截取行和列组成,

    逗号前面的截取的是某行,后面截取的是某列

    返回的是series 类型

    • 整数

      e.g. dataframe.iloc[5] 返回dataframe 中第五行的数据

    • 整数 list 或者 array

      e.g. dataframe.iloc[[4, 3]]. 返回dataframe 中第四行和第三行的数据

    • 切片(slice)

      e.g. dataframe.iloc[:5]返回dataframe 中前五行的数据(第零到第四行,不包括第五行)

      e.g. dataframe.iloc[2:5]返回dataframe 中第二行到第四行的数据(共三行不包括第五行)

    • 两个整数 dataframe.iloc[5,4]

      返回第五行第四个元素的值

    • 布尔值 array , 布尔数组长度等于行数)

      e.g. iloc[[True,True,True,False,False,False]] 前三行

    • 按列切片

      e.g. dataframe.iloc[:,5] 返回dataframe 中第五列的数据

      e.g. dataframe.iloc[:,:5] 返回dataframe 中前五列的数据(第零到第四列,不包括第五列)

      e.g. dataframe.iloc[:,2:5] 返回dataframe 中第二列到第四列的数据(共三列不包括第五列)

      e.g.dataframe.iloc[:5,:3] 返回dataframe 中前五行,前三列的数据

      e.g.dataframe.iloc[:5,[1,9,11]] 返回dataframe 中前五行,第一、九、十一列的数据

    dataframe.log()

    数据查询

    Dataframe 有很多筛选数据的功能,数据分析往往都是从对原始数据筛选这一步开始

    筛选返回的仍然是dataframe类型

    索引查询

    • 我们想要筛选 directmarketing'AmountSpent'列数据中大于0的行

      marketing[ marketing[ 'AmountSpent' ] > 1000 ]
      
    • 想要筛选 directmarketing'AmountSpent'列数据中大于0的前10行

      marketing[ marketing[ 'AmountSpent' ] > 1000 ][:10]
      
    • 判断条件里也可以包括逻辑运算符(& | not )
      想要筛选同时满足 directmarketing里
      'AmountSpent'列数据中大于1000
      'Gender''Male'

      marketing[marketing[ 'AmountSpent' ] > 1000 ) & (marketing['Gender'] == 'Male') ]  
      

      注意条件判断里面等号是 == 不是一个等号

    • 只需要A和B列数据,而D和C列数据都是用于筛选的

      想要筛选'Age'Gender列数据,筛选条件是

      'AmountSpent'列数据中大于1000
      'OwnHome'是'Own'

      marketing[['Age','Gender']][ (marketing['AmountSpent' ] > 1000) & (marketing['OwnHome'] == 'Own')]
    
    • 上面的方法都是通过一个布尔索引完成的,直接用布尔索引筛选

      index = (marketing['AmountSpent' ] > 1000) & (marketing['OwnHome'] == 'Own')
      print(marketing[ index ])
      
    • 使用insin方法来筛选特定的值,把要筛选的值写到一个列表里,如alist

       alist = [6,8,12]
       index = marketing['Catalogs'].isin(alist)
       print(marketing[index])       
      
    • 查询函数dataframe.query('筛选条件')

      big_earners = marketing.query("Salary > 90000") 
      

    Challenge

    Printing select columns and rows

    从文件读取数据至 Dataframe,截取目标数据

    pd.read_csv()函数和dataframe.iloc[]函数

    import pandas as pd
    marketing = pd.read_csv('DirectMarketing.csv')
    print(marketing.iloc[:10,[2,3,7]])
    

    Value counts

    询问用户想找那一列,返回该列的每个唯一值对应的数据个数

    input()函数,从dataframe中根据列名抽取 seriesseriesvalue_count()函数

    import pandas as pd
    marketing = pd.read_csv('DirectMarketing.csv')
    name = input('Enter a column name: ')
    print(marketing[ name ].value_counts())
    

    Slicing

    根据索引截取某几行,从第某列到第某列

    dataframe.iloc[]函数

    import pandas as pd
    marketing = pd.read_excel('DirectMarketing.xlsx') 
    print(marketing.iloc[[3,42,67,101],:8])
    

    Query

    Outputs the Salary, Catalogs and AmountSpent of the first 10 people where their AmountSpent is less than 1000.

    筛选数据中的Salary, Catalogs 和 AmountSpent 列的前10行,条件是AmountSpent 小于 1000

    数据筛选

    import pandas as pd 
    marketing = pd.read_excel('DirectMarketing.xlsx') 
    print(marketing[['Salary','Catalogs','AmountSpent']][marketing.AmountSpent < 1000 ][:10])
    

    Query with input

    Ask for a salary and then output the salary of the first 5 people with a salary greater than that specified.

    要求用户输入薪水,筛选数据所有列的前5行,条件是薪水比用户输入的多

    数据筛选

    import pandas as pd 
    marketing = pd.read_excel('DirectMarketing.xlsx') 
    #print(marketing)
    num = int(input('Enter a Salary: '))
    s = marketing[['Salary']][marketing.Salary > num][:5]['Salary']
    print(s)
    

    Adding a new column

    loads in the Excel file AmountSpent_13to17.xlsx and add in a column called ' Difference' which contains the amount spent in 2017 - amount spend in 2013. You should print out the first 5 lines (lines 0 - 4 inclusive).

    读取文件,在表后面添加一列,并取前五行

    在原数据后添加新列df['新列名'] = 数据,因为输出结果是dataframe 因此用df.head(5) 而不是截取函数

    import pandas as pd
    spent = pd.read_excel('AmountSpent_13to17.xlsx')
    spent['Difference'] = spent['2017']-spent['2013']
    print(spent.head(5))
    

    相关文章

      网友评论

          本文标题:Pandas 数据添加清洗截取查询

          本文链接:https://www.haomeiwen.com/subject/vphwlctx.html