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))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354