对于数据分析而言,数据大部分来源于外部数据,如常用的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倍标准差的值。