數據分析的Pandas

一.處理丟失數據php

  兩種丟失數據html

    None      None是Python自帶的,其類型爲python object。所以,None不能參與到任何計算中。python

    np.nan(NaN)      np.nan是浮點類型,能參與到計算中。但計算的結果老是NaN。c++

   pandas中的None與NaNweb

     1) pandas中None與np.nan都視做np.nanjson

import numpy as np
import pandas as pd
from pandas import Series,DataFrame


#建立DataFrame
df = DataFrame(data=np.random.randint(10,50,size=(8,8)))
df

##將某些數組元素賦值爲nan

df.iloc[1,3] = None
df.iloc[2,2] = None
df.iloc[4,2] = None
df.iloc[6,7] = np.nan

    2) pandas處理空值操做數組

      isnull()app

      notnull()dom

      dropna(): 過濾丟失數據ide

      fillna(): 填充丟失數據

df.isnull()

#建立DataFrame,給其中某些元素賦值爲nan

df.notnull().all(axis=1)     #notnull(all)   isnull(any)

df.loc[df.notnull().all(axis=1)]

    df.dropna() 能夠選擇過濾的是行仍是列(默認爲行):axis中0表示行,1表示的列

df.dropna(axis=0)

     填充函數 Series/DataFrame

       fillna():value和method參數

df.fillna(method='ffill',axis=1)

#method 控制填充的方式 bfill ffill

 

二.建立多層列索引

 

  隱式構造

    最多見的方法是給DataFrame構造函數的index或者columns參數傳遞兩個或更多的數組

  顯示構造pd.Multilndex.from_

    使用數組

    使用 product:

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

col=pd.MultiIndex.from_product([['qizhong','qimo'],
                                ['chinese','math']])

#建立DF對象
df = DataFrame(data=np.random.randint(60,120,size=(2,4)),index=['tom','jay'],
         columns=col)
#df

df['qimo']

2.多層行索引

  除了列索引,行索引也能用上述一樣的方法建立多層行索引

3.多層索引對象的索引與切片操做

總結:
# 訪問一列或多列 直接用中括號[columnname]  [[columname1,columnname2...]]
#訪問一行或多行  .loc[indexname]
# 訪問某一個元素  .loc[indexname,columnname]  獲取李四期中的php成績
# 行切片          .loc[index1:index2]        獲取張三李四的期中成績
# 列切片          .loc[:,column1:column2]    獲取張三李四期中的php和c++成績

4.聚合操做

  所謂的聚合操做:平均數,方差,最大值,最小值……

三.pandas的拼接操做

1.使用pd.concat()級聯

  pandas使用pd.concat函數,與np.concatenate函數相似,只是多了一些參數:

    objs

    axis=0

    keys

    join='outer' / 'inner':表示的是級聯的方式,outer會將全部的項進行級聯(忽略匹配和不匹配),而inner只會將匹配的項級聯到一塊兒,不匹配的不級聯

    ignore_index=False

   匹配級聯

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

df1 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','b','c'],columns=['A','B','C'])
df2 = DataFrame(data=np.random.randint(0,100,size=(3,3)),index=['a','d','c'],columns=['A','d','C'])

pd.concat((df1,df1),axis=0,join='inner')

   不匹配級聯

    不匹配指的是級聯的維度的索引不一致。例如縱向級聯時列索引不一致,橫向級聯時行索引不一致

     有2種鏈接方式:

      外鏈接:補NaN(默認模式)

       內鏈接:只鏈接匹配的項
pd.concat((df1,df2),axis=1,join='outer')

   使用df.append()函數添加

    因爲在後面級聯的使用很是廣泛,所以有一個函數append專門用於在後面添加

2.使用pd.merge()合併

  merge與concat的區別在於,merge須要依據某一共同的列來進行合併

  使用pd.merge()合併時,會自動根據二者相同column名稱的那一列,做爲key來進行合併。

  注意每一列元素的順序不要求一致

   參數:

    how:out取並集 inner取交集

     on:當有多列相同的時候,可使用on來指定使用那一列進行合併,on的值爲一個列表

  一對一合併

df1 = DataFrame({'employee':['Bob','Jake','Lisa'],
                'group':['Accounting','Engineering','Engineering'],
                })
df1

df2 = DataFrame({'employee':['Lisa','Bob','Jake'],
                'hire_date':[2004,2008,2012],
                })
df2

pd.merge(df1,df2,how='outer')

  多對一合併

df3 = DataFrame({
    'employee':['Lisa','Jake'],
    'group':['Accounting','Engineering'],
    'hire_date':[2004,2016]})
df3

df4 = DataFrame({'group':['Accounting','Engineering','Engineering'],
                       'supervisor':['Carly','Guido','Steve']
                })
df4

pd.merge(df3,df4)

  多對多合併

df1 = DataFrame({'employee':['Bob','Jake','Lisa'],
                 'group':['Accounting','Engineering','Engineering']})
df1

df5 = DataFrame({'group':['Engineering','Engineering','HR'],
                'supervisor':['Carly','Guido','Steve']
                })
df5

pd.merge(df1,df5,how='outer')

    加載excl數據:pd.read_excel('excl_path',sheetname=1)

  key的規範化

    當列衝突時,即有多個列名稱相同時,須要使用on=來指定哪個列做爲key,配合suffixes指定衝突列名

df1 = DataFrame({'employee':['Jack',"Summer","Steve"],
                 'group':['Accounting','Finance','Marketing']})

df2 = DataFrame({'employee':['Jack','Bob',"Jake"],
                 'hire_date':[2003,2009,2012],
                'group':['Accounting','sell','ceo']})

    當兩張表沒有可進行鏈接的列時,可以使用left_on和right_on手動指定merge中左右兩邊的哪一列列做爲鏈接的列

df1 = DataFrame({'employee':['Bobs','Linda','Bill'],
                'group':['Accounting','Product','Marketing'],
               'hire_date':[1998,2017,2018]})

df5 = DataFrame({'name':['Lisa','Bobs','Bill'],
                'hire_dates':[1998,2016,2007]})

  內合併與外合併:out取並集  inner取交集

    內合併:只保留二者都有的key(默認模式)

df6 = DataFrame({'name':['Peter','Paul','Mary'],
               'food':['fish','beans','bread']}
               )
df7 = DataFrame({'name':['Mary','Joseph'],
                'drink':['wine','beer']})

    外合併 how='outer':補NaN

df6 = DataFrame({'name':['Peter','Paul','Mary'],
               'food':['fish','beans','bread']}
               )
df7 = DataFrame({'name':['Mary','Joseph'],
                'drink':['wine','beer']})
display(df6,df7)
pd.merge()

示例

 

需求:
導入文件,查看原始數據
將人口數據和各州簡稱數據進行合併
將合併的數據中重複的abbreviation列進行刪除
查看存在缺失數據的列
找到有哪些state/region使得state的值爲NaN,進行去重操做
爲找到的這些state/region的state項補上正確的值,從而去除掉state這一列的全部NaN
合併各州面積數據areas
咱們會發現area(sq.mi)這一列有缺失數據,找出是哪些行
去除含有缺失數據的行
找出2010年的全民人口數據
計算各州的人口密度
排序,並找出人口密度最高的五個州 df.sort_values()

 

import numpy as np
from pandas import DataFrame,Series
import pandas as pd

abb = pd.read_csv('./data/state-abbrevs.csv')
pop = pd.read_csv('./data/state-population.csv')
area = pd.read_csv('./data/state-areas.csv')

#將人口數據和各州簡稱數據進行合併
display(abb.head(1),pop.head(1))
abb_pop = pd.merge(abb,pop,left_on='abbreviation',right_on='state/region',how='outer')
abb_pop.head()
#將合併的數據中重複的abbreviation列進行刪除
abb_pop.drop(labels='abbreviation',axis=1,inplace=True)
abb_pop.head()
#查看存在缺失數據的列
abb_pop.isnull().any(axis=0)
#找到有哪些state/region使得state的值爲NaN,進行去重操做

#1.檢測state列中的空值
abb_pop['state'].isnull()

#2.將1的返回值做用的state_region這一列中
abb_pop['state/region'][abb_pop['state'].isnull()]

#3.去重
abb_pop['state/region'][abb_pop['state'].isnull()].unique()
#爲找到的這些state/region的state項補上正確的值,從而去除掉state這一列的全部NaN
abb_pop['state/region'] == 'USA'
[{"metadata":{"trusted":false},"cell_type":"code","source":"indexs = abb_pop['state'][abb_pop['state/region'] == 'USA'].index","execution_count":23,"outputs":[]}]
abb_pop.loc[indexs,'state'] = 'United State'
pr_index = abb_pop['state'][abb_pop['state/region'] == 'PR'].index
abb_pop.loc[pr_index,'state'] = 'PPPRRR'
#合併各州面積數據areas
abb_pop_area = pd.merge(abb_pop,area,how='outer')
abb_pop_area.head()
#咱們會發現area(sq.mi)這一列有缺失數據,找出是哪些行
abb_pop_area['area (sq. mi)'].isnull()

a_index = abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()].index

#去除含有缺失數據的行
abb_pop_area.drop(labels=a_index,axis=0,inplace=True)

#找出2010年的全民人口數據
abb_pop_area.query('year == 2010 & ages == "total"')

#計算各州的人口密度
abb_pop_area['midu'] = abb_pop_area['population'] / abb_pop_area['area (sq. mi)']
abb_pop_area.head()

#排序,並找出人口密度最高的五個州 df.sort_values()
abb_pop_area.sort_values(by='midu',axis=0,ascending=False).head()

 

 

 

 
|
相關文章
相關標籤/搜索