数据分析的Pandas

一.处理丢失数据

  两种丢失数据

    None      None是Python自带的,其类型为python object。因此,None不能参与到任何计算中。

    np.nan(NaN)      np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。

   pandas中的None与NaN

     1) pandas中None与np.nan都视作np.nan

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

      notnull()

      dropna(): 过滤丢失数据

      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()
 
|
原文地址:https://www.cnblogs.com/chenxi67/p/10491135.html