Pandas 数据添加清洗截取查询

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

你或许想:《去原作者写文章的地方

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
NumPy
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论