一.處理丟失數據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')
不匹配級聯
不匹配指的是級聯的維度的索引不一致。例如縱向級聯時列索引不一致,橫向級聯時行索引不一致
外鏈接:補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取交集
一對一合併
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()