一.处理丢失数据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()