Pandas数据载入与预处理期末复习

对于数据分析而言,数据大部分来源于外部数据,如常用的CSV文件、Excel文件和数据库文件等。Pandas库将外部数据转换为DataFrame数据格式,处理完成后再存储到相应的外部文件中。  Pandas 常用的导入格式:import pandas as pd

1.文本文件读取     文本文件是一种由若干行字符构成的计算机文件,它是一种典型的顺序文件。

txt文件:是Windows操作系统上附带的一种文本格式,文件以.txt为后缀。 CSV文件:是Comma-Separated Values的缩写,用半角逗号(’,’)作为字段值的分隔符。

1.文本文件读取 Pandas中使用read_table来读取文本文件:     pandas.read_table(filepath_or_buffer, sep=’\t’, header=’infer’, names=None, index_col=None, dtype=None, engine=None, nrows=None)

Pandas中使用read_csv函数来读取CSV文件:     pandas.read_csv(filepath_or_buffer, sep=’,’, header=’infer’, names=None, index_col=None, dtype=None, engine=None, nrows=None) 

2. 文本文件的存储     文本文件的存储和读取类似,结构化数据可以通过pandas中的to_csv函数实现以CSV文件格式存储文件。     DataFrame.to_csv(path_or_buf = None, sep = ’,’, na_rep, columns=None, header=True, index=True, index_label=None, mode=’w’, encoding=None)

参数名称

说明

filepath

接收string,代表文件路径,无默认

sep

接收string,代表分隔符。read_csv默认为“,”,read_table默认为制表符“\t”,如果分隔符指定错误,在读取数据的时候,每一行数据将连成一片

header

接收int或sequence,表示将某行数据作为列名,默认为infer,表示自动识别

names

接收array,表示列名,默认为None

index_col

接收int、sequence或False,表示索引列的位置,取值为sequence则代表多重索引,默认为None

dtype

接收dict,代表写入的数据类型(列名为key,数据格式为values),默认为None

engine

接收c或者python,代表数据解析引擎,默认为c

nrows 

接收int,表示读取前n行,默认为None

 1. Excel文件的读取     Pandas提供了read_excel函数读取“xls”和“xlsx”两种excel文件,其格式为:        pandas.read_excel(io, sheetname, header=0, index_col=None, names=None, dtype)     read_excel函数和read_table函数的部分参数相同,

参数名称

说明

io

接收string,表示文件路径,无默认

sheetname

接收string、int,代表excel表内数据的分表位置,默认为0

header

接收int或sequence,表示将某行数据作为列名,默认为infer,表示自动识别

names

接收int、sequence或者False,表示索引列的位置,取值为sequence则代表多重索引,默认为None

index_col

接收int、sequence或者False,表示索引列的位置,取值为sequence则代表多重索引,默认为None

dtype

接收dict,代表写入的数据类型(列名为key,数据格式为values),默认为None

     merge函数是通过一个或多个键将两个DataFrame按行合并起来,与SQL中的 join 用法类似,Pandas中的数据合并merge( )函数格式如下:     merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)

参数

使用说明

left

参与合并的左侧DataFrame

right

参与合并的右侧DataFrame

how

连接方法:inner,left,right,outer

on

用于连接的列名

left_on

左侧DataFrame中用于连接键的列

right_on

右侧DataFrame中用于连接键的列

left_index

左侧DataFrame中行索引作为连接键

right_index

右侧DataFrame中行索引作为连接键

sort

合并后会对数据排序,默认为True

suffixes

修改重复列名的后缀名

import pandas as pd
import numpy as np
price=pd.DataFrame({'fruit':['apple','grape','orange','orange','plum'],'price':[9,7,9,11,12]})
amount=pd.DataFrame({'fruit':['apple','grape','orange'],'amount':[5,11,8]})
print(price,"\n",amount,"\n",pd.merge(price,amount))
print(pd.merge(price,amount,how='left'))
print(pd.merge(price,amount,how='right'))


out:
    fruit  price
0   apple      9
1   grape      7
2  orange      9
3  orange     11
4    plum     12 
     fruit  amount
0   apple       5
1   grape      11
2  orange       8 
     fruit  price  amount
0   apple      9       5
1   grape      7      11
2  orange      9       8
3  orange     11       8
    fruit  price  amount
0   apple      9     5.0
1   grape      7    11.0
2  orange      9     8.0
3  orange     11     8.0
4    plum     12     NaN
    fruit  price  amount
0   apple      9       5
1   grape      7      11
2  orange      9       8
3  orange     11       8

 两个DataFrame都有fruit列,所以默认按照该列进行合并,默认how='inner', 即pd.merge(amount,price,on='fruit',how='inner') 如果两个DataFrame的列名不相同,可以单独指定

指定合并时的列名

display(pd.merge(price,amount,left_on = 'fruit',right_on = 'fruit'))

merge合并时默认是内连接(inner),即返回交集。通过how参数可以选择连接方法:左连接(left),右连接(right)和外连接(outer)。

参数    说明
left    左表
right    右表
how    连接方式,inner、left、right、outer,默认为inner
on    用于连接的列名称
left_on    左表用于连接的列名
right_on    右表用于连接的列名
left_index    是否使用左表的行索引作为连接键,默认False
right_index    是否使用右表的行索引作为连接键,默认False
sort    默认为False,将合并的数据进行排序
copy    默认为True,总是将数据复制到数据结构中,设置为False可以提高性能
suffixes    存在相同列名时在列名后面添加的后缀,默认为(’_x’, ‘_y’)
indicator    显示合并数据中数据来自哪个表
 

    如果要合并的DataFrame之间没有连接键,就无法使用merge方法。pandas中的concat方法可以实现,默认情况下会按行的方向堆叠数据。如果在列向上连接设置axies = 1即可。

import pandas as pd
import numpy as np
s1=pd.Series([0,1],index=['a','b'])
s2=pd.Series([2,3,4],index=['a','d','e'])
s3=pd.Series([5,6],index=['f','g'])
print(pd.concat([s1,s2,s3]))

out:
a    0
b    1
a    2
d    3
e    4
f    5
g    6
dtype: int64

参数名

说明

objs

参与连接的对象,必要参数

axis

指定轴,默认为0

join

inner或者outer,默认为outer,指明其他轴的索引按哪种方式进行合并,inner表示取交集,outer表示取并集

join_axes

指明用于其他n-1条轴的索引,不执行并集/交集运算

keys

与连接对象有关的值,用于形成连接轴向上的层次化索引。可以是任意值的列表或数组

levels

指定用作层次化索引各级别上的索引

names

用于创建分层级别的名称,如果设置了keys和levels

verify_integrity

检查结果对象新轴上的重复情况,如果发现则引发异常。默认False允许重复

ignore_index

不保留连接轴上的索引,产生一组新索引

 

 

      如果需要合并的两个DataFrame存在重复索引,则使用merge和concat都无法正确合并,此时需要使用combine_first方法

       如果需要合并的两个DataFrame存在重复索引,则使用merge和concat都无法正确合并,此时需要使用combine_first方法。

import pandas as pd
import numpy as np
string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
print(string_data)
print(string_data.isnull())


out
0     aardvark
1    artichoke
2          NaN
3      avocado
dtype: object
0    False
1    False
2     True
3    False
dtype: bool
import pandas as pd
import numpy as np
df=pd.DataFrame(np.arange(12).reshape(3,4),columns=['a','b','c','d'])
df.iloc[2,:]=np.nan
df[3]=np.nan
print(df)
print(df.isnull().sum())
print(df.info())

out
     a    b    c    d   3
0  0.0  1.0  2.0  3.0 NaN
1  4.0  5.0  6.0  7.0 NaN
2  NaN  NaN  NaN  NaN NaN
a    1
b    1
c    1
d    1
3    3
dtype: int64
dtype: int64
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   a       2 non-null      float64
 1   b       2 non-null      float64
 2   c       2 non-null      float64
 3   d       2 non-null      float64
 4   3       0 non-null      float64

1)删除缺失值     在缺失值的处理方法中,删除缺失值是常用的方法之一。通过dropna方法可以删除具有缺失值的行。     dropna方法的格式:     dropna(axis=0, how=‘any’, thresh=None, subset=None,  inplace=False) 

参数名称

使用说明

axis 

默认为axis=0,当某行出现缺失值时,将该行丢弃并返回,当axis=1,当某列出现缺失值时,将该列丢弃

how

表示删除的形式。any表示只要有缺失值存在就执行删除操作。all表示当且仅当全部为缺失值时执行删除操作。默认为any。

thresh

阈值设定,当行列中非空值的数量少于给定的值就将该行丢弃

subset

inplace

表示进行去重的列∕行,如:subset=[ ’a’ ,’d’], 即丢弃子列 a d 中含有缺失值的行

bool取值,默认False, 当inplace= True,即对原数据操作,无返回值

import pandas as pd
import numpy as np
from numpy import nan as NA
data=pd.Series([1,NA,3.5,NA,7])
print(data)
print(data.dropna())

out:
0    1.0
1    NaN
2    3.5
3    NaN
4    7.0
dtype: float64
0    1.0
2    3.5
4    7.0
dtype: float64
import pandas as pd
import numpy as np
from numpy import nan as NA
data=pd.DataFrame([[1,2,3],[1,NA,NA],[NA,NA,NA],[NA,8,9]])
print(data)
print(data.dropna())
print(data.dropna(how='all'))
print(data.dropna(axis=1))

out:
     0    1    2
0  1.0  2.0  3.0
1  1.0  NaN  NaN
2  NaN  NaN  NaN
3  NaN  8.0  9.0
     0    1    2
0  1.0  2.0  3.0
     0    1    2
0  1.0  2.0  3.0
1  1.0  NaN  NaN
3  NaN  8.0  9.0
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]

2)填充缺失值     缺失值所在的特征为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来填充;缺失值所在特征为类别型数据时,则选择众数来填充。     Pandas库中提供了缺失值替换的方法fillna,格式如下:DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None)

参数名称

参数说明

value

用于填充缺失值的标量值或字典对象

method

插值方式

axis

待填充的轴,默认axis=0

inplace

修改调用者对象而不产生副本

limit

(对于前向和后向填充)可以连续填充的最大数量

import pandas as pd
import numpy as np
from numpy import nan as NA
df=pd.DataFrame(np.random.randn(5,3))
df.loc[:3,1]=NA
df.loc[:2,2]=NA
print(df)
print(df.fillna({1:0.88,2:0.66}))


          0         1         2
0 -1.912071       NaN       NaN
1  1.163571       NaN       NaN
2 -0.960915       NaN       NaN
3 -0.173496       NaN  1.702904
4  0.696184  1.056587  0.159865
          0         1         2
0 -1.912071  0.880000  0.660000
1  1.163571  0.880000  0.660000
2 -0.960915  0.880000  0.660000
3 -0.173496  0.880000  1.702904
4  0.696184  1.056587  0.159865
import pandas as pd
import numpy as np
from numpy import nan as NA
df=pd.DataFrame(np.random.randn(5,3))
df.loc[2:,1]=NA
df.loc[4:,2]=NA
print(df)
print(df.fillna(method='ffill'))

          0         1         2
0  1.128864 -2.078626 -2.444873
1  0.425334 -1.535026 -0.658621
2 -0.021138       NaN  0.555376
3  1.872106       NaN  2.487438
4 -0.737430       NaN       NaN
          0         1         2
0  1.128864 -2.078626 -2.444873
1  0.425334 -1.535026 -0.658621
2 -0.021138 -1.535026  0.555376
3  1.872106 -1.535026  2.487438
4 -0.737430 -1.535026  2.487438
import pandas as pd
import numpy as np
from numpy import nan as NA
data=pd.Series([1,NA,3.5,NA,7])
print(data.fillna(data.mean())

0    1.000000
1    3.833333
2    3.500000
3    3.833333
4    7.000000
dtype: float64
import pandas as pd
import numpy as np
from numpy import nan as NA
df=pd.DataFrame(np.random.randn(4,3))
df.iloc[2:,1]=NA
df.iloc[3:,2]=NA
print(df)
df[1]=df[1].fillna(df[1].mean())
print(df)


          0         1         2
0 -1.042562 -1.333064 -0.428200
1 -0.133928  0.345835  0.520909
2  1.065939       NaN  2.388825
3  0.479309       NaN       NaN
          0         1         2
0 -1.042562 -1.333064 -0.428200
1 -0.133928  0.345835  0.520909
2  1.065939 -0.493614  2.388825
3  0.479309 -0.493614       NaN

    在DataFrame中利用duplicates方法判断各行是否有重复数据。duplicates方法返回一个布尔值的series,反映每一行是否与之前的行重复。

Pandas通过drop_duplicates删除重复的行,格式为: drop_duplicates(self, subset=None, keep=’first’, inplace=False)

import pandas as pd
import numpy as np
from numpy import nan as NA
data=pd.DataFrame({'k1':['one','two']*3+['two'],'k2':[1,1,2,3,1,4,4],'k3':[1,1,5,2,1,4,4]})
print(data)
print(data.duplicated())


    k1  k2  k3
0  one   1   1
1  two   1   1
2  one   2   5
3  two   3   2
4  one   1   1
5  two   4   4
6  two   4   4
0    False
1    False
2    False
3    False
4     True
5    False
6     True
dtype: bool

参数名称

使用说明

subset

接收string或sequence,表示进行去重的列,默认全部列

keep

接收string,表示重复时保留第几个数据,‘first’保留第一个,

‘last’保留最后一个,‘false’只要有重复都不保留,默认为first

inplace

接收布尔型数据,表示是否在原表上进行操作,默认为False

import pandas as pd
import numpy as np
from numpy import nan as NA
data=pd.DataFrame({'k1':['one','two']*3+['two'],'k2':[1,1,2,3,1,4,4],'k3':[1,1,5,2,1,4,4]})
print(data)
print(data.duplicated())
print(data.drop_duplicates(['k2','k3']))
print(data.drop_duplicates(['k2','k3'],keep='last'))


    k1  k2  k3
0  one   1   1
1  two   1   1
2  one   2   5
3  two   3   2
4  one   1   1
5  two   4   4
6  two   4   4
0    False
1    False
2    False
3    False
4     True
5    False
6     True
dtype: bool
    k1  k2  k3
0  one   1   1
2  one   2   5
3  two   3   2
5  two   4   4
    k1  k2  k3
2  one   2   5
3  two   3   2
4  one   1   1
6  two   4   4

    简单的数据统计方法中常用散点图、箱线图和3σ法则检测异常值。 散点图方法: 通过数据分布的散点图发现异常数据。 箱线图分析: 利用数据中的五个统计量(最小值、下四分位数、中位数、上四分位数和最大值)来描述数据。 3σ法则: 在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值。

猜你喜欢

转载自blog.csdn.net/qq_51250393/article/details/121895085