Pandas之DataFrame
- 1 DataFrame介绍
- 2 创建DataFrame
- 3 常用属性
- 4 访问数据
- 5 处理重复数据
- 6 删除数据
- 7 添加数据
- 8 修改数据
- 9 缺失值处理
- 10 分组
- 11 聚合
- 12 排序
- 13 统计
- 14 数据表关联
- 15 索引设置
- 16 数据的读取与存储
1 DataFrame介绍
DataFrame是一个类似于二维数组或表格(如excel)的对象,既有行索引,又有列索引
2 创建DataFrame
(1)从列表创建DataFrame
1
2
3
4
5import pandas as pd data = [1,2,3,4,5] df = pd.DataFrame(data=data) df
1
2
3
4data = [['Alex',10],['Bob',12],['Clarke',13]] df = pd.DataFrame(data,columns=['Name','Age'],index=['a','b','c'],dtype=float) df
1
2
3
4data=[{'a':1,'b':2},{'a':7,'b':5,'c':34}] df = pd.DataFrame(data) df
(2)从字典来创建DataFrame
1
2
3
4
5data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'], 'Age':[28,34,29,42]} df = pd.DataFrame(data, index=['s1','s2','s3','s4']) df
1
2
3
4
5data = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']), 'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])} df = pd.DataFrame(data) df
(3)导入外部文件创建DataFrame
1
2df=pd.read_csv('./bikes.csv',sep=';')
3 常用属性
(1)查看前n行数据
1
2
3df.head(n) df.head() # 默认查看前5行
(2)查看后n行数据(默认后5行)
1
2
3df.tail(n) df.tail() # 默认查看后5行
(3)查看各列信息
1
2df.info()
(4)查看数据形状
1
2df.shape
(5)查看每一列的数据类型
1
2
3
4df.dtypes # 查看one这一列的数据类型 # df["one"].dtype
(6)查看数据值
1
2df.values
(7)查看数据的列名
1
2df.columns
(8)查看数据的索引
1
2df.index
将索引转换为列使用reset_index()
函数
- drop:bool,default False
- 删除索引并将其转化成列,默认是False:转化成列;True:删除的索引直接丢弃,不转化成列
- inplace:bool,defualt False
- 是否在原数据上做更改,默认False:不在源数据上做更改,此时有返回值DataFrame需要变量进行赋值;True无返回值
(9)查看行/列标签列表
1
2df.axes
(10)判断空系列
1
2
3# 如果系列为空,则返回True df.empty
(11)返回底层数据的维数,默认定义:1
1
2df.ndim
(12)返回基础数据中的元素数
1
2df.size
4 访问数据
1
2
3
4
5
6data = {'one' : pd.Series([6, 2, 3], index=['a', 'b', 'c']), 'two' : pd.Series([1, 4, 9, 4], index=['a', 'b', 'c', 'd']), 'three' : pd.Series([2, 2, 7, 4], index=['a', 'b', 'e', 'd'])} df=pd.DataFrame(data) df
对于loc选取行列数据, loc是select by label(name):
- 行根据行标签,也就是索引筛选,列根据列标签,列名筛选
- 如果选取的是所有行或者所有列,可以用
:
代替- 行标签选取的时候,两端都包含,比如[0:5]指的是0,1,2,3,4,5
对于iloc选取行列数据,iloc是select by position,仅接受整数作为参数。
- iloc基于位置索引,简言之,就是第几行第几列,这里的行列都是从0开始的
- iloc的0:X中不包括X,只能到X-1
df.loc的第一个参数是行标签,第二个参数为列标签(可选参数,默认为所有列标签),两个参数既可以是列表也可以是单个字符,df.iloc同理
(1)行访问
1
2
3t=pd.DataFrame(np.random.rand(2),index=[1,0]) t
np.random.rand
详细用法见:https://blog.csdn.net/qq_40130759/article/details/79535575
返回 df 位置索引为1和3的数据,即第二条和第四条数据
1
2
3df.iloc[[1,3]] df.loc[['b','d']]
1
2
3df.iloc[[0,1],[0,1]] df.loc[["a","b"],["one","two"]]
1
2df.loc["a":"d"]
(2)列访问
1
2
3
4
5
6
7
8
9# 查看one列数据 df['one'] # 查看one列的前3行数据 df['one'][:3] # 查看one、two列数据 df[['one','two']]
(3)条件访问
1
2
3
4d={'col1':[1,2,3],'col2':[4,5,6],'col3':[7,8,9]} d=pd.DataFrame(data=d,index=['A','B','C']) d
① 直接筛选
直接使用列需要满足的条件,如果需要多个列同时满足条件,使用"&"
符号连接即可;如果只需要某一列满足条件,则使用"|"
连接多个列的条件。
1
2
3
4
5
6# 返回col1列值大于1的数据 d[d['col1']>1] # 返回col1列值等于1且col2列值等于4的数据 d[(d['col1'] == 1) & (d['col2']==4)]
② 使用query函数
1
2
3
4
5
6
7
8# 查询col1列中数值为2的行记录 d.query('col1==2') # 查询col1列数值小于col2列的行记录 d.query('col1 < col2') # 等价于 d[d.col1 < d.col2]
③ 使用map函数
这个筛选方式和直接筛选唯一不同的就是,把筛选条件给隔离出来了
1
2
3
4
5
6# 返回col1列值等于1且col2列值等于4的数据 a = d['col1'].map(lambda x : x==1) b = d['col2'].map(lambda x : x==4) some = d[a & b] some
5 处理重复数据
1
2
3
4
5from numpy import NAN d={'col1':[NAN,2,2,4],'col2':[4,5,6,4],'col3':[7,8,9,10]} d=pd.DataFrame(data=d,index=['A','B','C','D']) d
(1)检查是否有重复记录
① 某一列的数据是否唯一
1
2
3
4
5
6
7
8
9
10# col1列的数据是否唯一 d.col1.is_unique # False,不唯一 # unique函数可以返回唯一值 unqiue=d.col1.unique() unqiue # array([nan, 2., 4.]) # nunique函数返回的是唯一值的个数(不计空缺值) d.col1.nunique() # 2
② 整个数据表是否有重复记录
DataFrame的duplicated
方法返回一个布尔型Series,表示各行是否是重复行
1
2d.duplicated()
is_unique与duplicated都可以用于判断是否存在重复记录,区别在于:
- is_unique:是Series的属性,即只能对系列应用该属性
- duplicated:是DataFrame的函数,Series和DataFrame都可以使用
(2)删除重复记录
drop_duplicates()
subset
参数选择以哪个列为去重基准,默认所有的列。keep
参数则是保留方式,first是保留第一个,删除后余重复值,last是删除前面,保留最后一个,默认firstinplace
参数,布尔值,默认为False,指的是直接在原来数据上修改还是保留一个副本
1
2
3
4
5
6d = {'one' : pd.Series([2, 2, 3,1], index=['a', 'b', 'c','d']), 'two' : pd.Series([6, 4, 9, 4], index=['a', 'b', 'c', 'd']), 'three' : pd.Series([2, 5, 7, 4], index=['a', 'b', 'e', 'd'])} df=pd.DataFrame(d) df
1
2
3df.drop_duplicates(subset='two',keep='last') # df.drop_duplicates(subset=["one","two"])
6 删除数据
1
2
3
4d={'col1':[NAN,2,2,4],'col2':[4,5,6,4],'col3':[7,8,9,10]} d=pd.DataFrame(data=d,index=['A','B','C','D']) d
(1)列删除
① del
1
2del(d['col1'])
② pop
1
2d.pop('col2')
注意:
del
和pop
进行删除操作时会改变原数据,另外pop
会返回删除的数据
(2)行删除
1
2
3d.drop('A') # 删除索引为A的行数据 d.drop(['A','B']) # 删除索引为A、B的行数据
1
2
3
4
5df = pd.DataFrame([['zs', 12], ['ls', 4]], columns = ['Name','Age']) df2 = pd.DataFrame([['ww', 16], ['zl', 8]], columns = ['Name','Age']) df = df.append(df2) df
1
2
3# 删除index为0的行 df.drop(0)
注意:对于
drop()
删除,如果不加axis=1
,则默认axis=0
按照行号进行删除。如果不设置参数inplace=True
,则只能在生成的新数据块中实现删除效果,而不能删除原有数据块的相应行。
7 添加数据
(1)添加列
1
2
3
4data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]} df = pd.DataFrame(data, index=['s1','s2','s3','s4']) df
① 直接添加新列
1
2
3
4
5# 添加score列 df['score']=pd.Series([90, 80, 70, 60], index=['s1','s2','s3','s4']) # 或者index=df.index df
注意:添加列数据时,若行索引不是默认的,则需要指定index
② insert()
另外,Insert
用于在DataFrame的指定位置中插入新的数据列。默认情况下新列是添加到末尾的,但可以更改位置参数,将新列添加到任何位置。
1
2Dataframe.insert(loc, column, value, allow_duplicates=False)
参数作用:
loc
: int型,表示插入位置在第几列;若在第一列插入数据,则 loc=0column
: 给插入的列取名,如 column=‘新的一列’value
:新列的值,数字、array、series等都可以allow_duplicates
: 是否允许列名重复,选择Ture表示允许新的列名与已存在的列名重复
③ loc()
1
2df.loc[:,新列名]=值
(2)添加行
1
2
3
4df2 = pd.DataFrame([['ww', 16,77], ['zl', 8,99]], columns = ['Name','Age','score'],index=['s5','s6']) df = df.append(df2) df
注意:即使原数据的行索引为默认值,添加行数据时也要按顺序指定索引,否则添加数据的行索引会默认重新从0开始
8 修改数据
1
2
3
4# 将Name列的第三行数据修改成“HUWEI” df['Name'][2]='HUWEI' df
9 缺失值处理
1
2
3df=pd.DataFrame([[1,4,9],[NAN,NAN,NAN],[8,0,NAN]]) df
(0)查找缺失值
isnull()
可以用于判断 dataframe 或者 series 的空值
notnull()
判断非空值
空值包括
查找第3列是否有缺失值,有多少个缺失值
(1)删除缺失值
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
1
2
3
4
5
6
7
8
9
10
11
12# axis=0: 删除包含缺失值的行(默认) df.dropna() # axis=1: 删除包含缺失值的列 df.dropna(axis=1) # how='all': 所有的值都缺失,才删除行或列 df.dropna(how='all') # how=‘any’ :只要有缺失值出现,就删除该行或列 df.dropna(how='any')
(2)填充缺失值
fillna()
- 传入
method=" "
重新索引时选择插值处理方式:method='ffill'或'pad'
前向填充(看前一个是什么,它就填充什么)method='bfill'或'backfill'
后向填充(看后一个是什么,它就填充什么)
- 传入
limit
参数限制填充个数 - 传入
axis
参数修改填充方向,默认axis=0
纵向填充,axis=1
横向填充 - 置
inplace=True
改变原数据
10 分组
1
2
3
4
5
6
7
8ipl_data = {'Team': ['Riders', 'Riders', 'Devils', 'Devils', 'Kings', 'kings', 'Kings', 'Kings', 'Riders', 'Royals', 'Royals', 'Riders'], 'Rank': [1, 2, 2, 3, 3,4 ,1 ,1,2 , 4,1,2], 'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017], 'Points':[876,789,863,673,741,812,756,788,694,701,804,690]} df = pd.DataFrame(ipl_data) df
groupby
返回可迭代对象,可以使用for
循环遍历
1
2
3
4
5
6
7
8
9
10
11grouped=df.groupby('Year') grouped # <pandas.core.groupby.DataFrameGroupBy object at 0x000001BD6977B3C8> grouped.groups """ {2014: Int64Index([0, 2, 4, 9], dtype='int64'), 2015: Int64Index([1, 3, 5, 10], dtype='int64'), 2016: Int64Index([6, 8], dtype='int64'), 2017: Int64Index([7, 11], dtype='int64')} """
1
2
3
4for year,group in grouped: print(year) print(group)
获得一个分组细节
1
2grouped.get_group(2014)
11 聚合
聚合每一年的分数之和、平均分、标准差
1
2
3agg = grouped['Points'].agg([np.sum, np.mean, np.std]) agg
12 排序
1
2
3
4
5
6
7d = {'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Minsu','Jack', 'Lee','David','Gasper','Betina','Andres']), 'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]), 'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])} unsorted_df = pd.DataFrame(d) unsorted_df
(1)降序
1
2
3
4# ascending=False表降序,默认ascending=True升序,默认按行标签排序 sorted_df = unsorted_df.sort_index(ascending=False) sorted_df
(2)按列标签排序
1
2
3sorted_df=unsorted_df.sort_index(axis=1) sorted_df
(3)按实际值排序
sort_values()
是按值排序的方法,参数inplace=True
可以改变原数据,它还接受一个by
参数,它将使用要与其排序值的DataFrame
的列名称。
1
2
3
4# 按照年龄排序(升序) sorted_df = unsorted_df.sort_values(by='Age') sorted_df
1
2
3
4# 先按Age进行升序排序,然后按Rating降序排序 sorted_df = unsorted_df.sort_values(by=['Age', 'Rating'], ascending=[True, False]) sorted_df
13 统计
数值型数据的描述性统计主要包括了计算数值型数据的完整情况、最小值、均值、中位 数、最大值、四分位数、极差、标准差、方差、协方差等。在NumPy库中一些常用的统计学函数也可用于对数据框进行描述性统计。
pandas提供了统计相关函数:
1
2
3
4# 测试描述性统计函数 df.sum() # 默认计算纵向数据的和 df.sum(1) # 计算横向数据的和
一般分类数据用value_counts()
,数值数据用describe()
,这是最常用的两个统计函数
value_counts()
方法是Series拥有的方法,它返回一个序列 Series,该序列包含每个值的数量。也就是说,对于数据框中的任何列,value-counts () 方法会返回该列每个项的计数。
1
2
3
4df.describe() # 该函数可以对某一列进行分析 # df["Age"].describe()
include
参数:包含哪类数据。默认只包含连续值,不包含离散值;include = ‘all’ 设置全部类型percentiles
参数:设置输出的百分位数,默认为[.25,.50,.75],返回第25,50,75百分位数
对连续值来说:
- count:每一列非空值的数量
- mean: 每一列的平均值
- std:每一列的标准差
- min:最小值
- 25%:25%分位数,排序之后排在25%位置的数
- 50%:50%分位数
- 75%:75%分位数
- max:最大值
对离散值来说特有的:
- unique:不重复的离散值数目,去重之后的个数
- top: 出现次数最多的离散值
- freq: 上述的top出现的次数
1
2df.Age.value_counts()
14 数据表关联
(1)merge()合并
1
2
3
4pd.merge(left, right, how = ‘inner’, on = None, left_on = None, right_on = None, left_index = False, right_index = False, sort = True, suffixes = (‘_x’,’_y’), copy = True, indicator = False, validate = None)
参数:
left、right
:需要连接的两个DataFrame或Series,一左一右how
:两个数据连接方式,可设置inner、outer、left或right,默认的方式是inner join,取交集,也就是保留左右表的共同内容;如果是left join,左边表中所有的内容都会保留;如果是right join,右表全部保留;如果是outer join,则左右表全部保留。关联不上的内容为NaNon
:作为连接键的字段,左右数据中都必须存在,否则需要用left_on和right_on来指定left_on
:左表的连接键字段right_on
:右表的连接键字段left_index
:为True时将左表的索引作为连接键,默认为Falseright_index
:为True时将右表的索引作为连接键,默认为Falsesuffixes
:如果左右数据出现重复列,新数据表头会用此后缀进行区分,默认为_x和_y
① 连接键 on
在数据连接时,如果没有指定根据哪一列(连接键)进行连接,Pandas会自动找到相同列名的列进行连接,并按左边数据的顺序取交集数据。为了代码的可阅读性和严谨性,推荐通过on参数指定连接键
1
2
3
4
5df1 = pd.DataFrame({'a':[1,2],'b':[5,6]}) df2 = pd.DataFrame({'a':[2,1,0],'y':[6,7,8]}) # 按a列进行连接,数据顺序取df1的顺序 res = pd.merge(df1, df2, on='a')
② 索引连接
可以直接按索引进行连接,将left_index和right_index设置为True,会以两个表的索引作为连接键
1
2
3
4
5df1 = pd.DataFrame({'a':[1,2],'b':[5,6]}) df2 = pd.DataFrame({'a':[2,1,0],'y':[6,7,8]}) # 两个表都有同名的a列,用suffixes参数设置后缀来区分 res = pd.merge(df1, df2, left_index=True, right_index=True, suffixes=('_1','_2'))
③ 多连接键
如果在合并数据时需要用多个连接键,可以以列表的形式将这些连接键传入on中
1
2
3
4
5df1 = pd.DataFrame({'a':[1,2],'b':[3,4],'x':[5,6]}) df2 = pd.DataFrame({'a':[1,2,3],'b':[3,4,5],'y':[6,7,8]}) # a和b列中的(1,3)和(2,4)作为连接键将两个数据进行了连接 res = pd.merge(df3, df4, on=['a','b'])
④ 连接指示
如果想知道数据连接后是左表内容还是右表内容,可以使用indicator参数显示连接方式
如果将indicator设置为True,则会增加名为_merge的列,显示这列是从何而来
_merge有以下三个值:
- left_only:只在左表中
- right_only:只在右表中
- both:两个表都有
1
2
3
4
5
6import pandas as pd df1 = pd.DataFrame({'a':[1,2],'b':[5,6]}) df2 = pd.DataFrame({'a':[2,1,0],'y':[6,7,8]}) # 显示连接指示列 res = pd.merge(df1, df2, on='a', how='outer', indicator=True)
(2)concat()合并
concat()函数可以沿着指定的轴将多个dataframe或者series拼接到一起。
1
2pd.concat( objs, axis=0, join=‘outer’, join_axes=None,ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)
参数:
- objs 表示需要连接的对象,比如:[df1, df2],需要将合并的数据用方括号包围;
- axis=0 表拼接方式是上下堆叠,当axis=1表示左右拼接;
- join 参数控制的是外连接还是内连接,inner,outer,这里默认值是outer并集
- ignore_index,连接后原来两个DF的index值会被保存,设置true,合并的两个表就会重新整理一个新的index
15 索引设置
(1)将某一列设置为索引
1
2
3rs=rs.set_index('student_name') rs
(2)重新设置索引
reset_index()
- drop: 重新设置索引后是否将原索引作为新的一列并入DataFrame,默认为False
- inplace: 是否在原DataFrame上改动,默认为False
16 数据的读取与存储
(1)读取与存储csv
1
2
3
4
5
6
7pd.read_table( filepath_or_buffer, sep='t', header='infer', names=None, index_col=None, dtype=None, engine=None, nrows=None) pd.read_csv( filepath_or_buffer, sep=',', header='infer', names=None, index_col=None, dtype=None, engine=None, nrows=None)
参数:
- filepath 文件路径。该字符串可以是一个URL。有效的URL方案包括http,ftp和file
- sep 分隔符。read_csv默认为“,”,read_table默认为制表符“[Tab]”。
- header 接收int或sequence。表示将某行数据作为列名。默认为infer,表示自动识别。
- names 接收array。表示列名。
- index_col 表示索引列的位置,取值为sequence则代表多重索引。
- dtype 代表写入的数据类型(列名为key,数据格式为values)。
- engine 接收c或者python。代表数据解析引擎。默认为c。
- nrows 接收int。表示读取前n行。
1
2df.to_csv(excel_writer=None, sheetname=None, header=True, index=True, index_label=None, mode=’w’, encoding=None)
(2)读取与存储excel
1
2pd.read_excel(io, sheetname=0, header=0, index_col=None, names=None, dtype=None)
参数:
- io 表示文件路径。
- sheetname 代表excel表内数据的分表位置。默认为0。
- header 接收int或sequence。表示将某行数据作为列名。默认为infer,表示自动识别。
- names 表示索引列的位置,取值为sequence则代表多重索引。
- index_col 表示索引列的位置,取值为sequence则代表多重索引。
- dtype 接收dict。数据类型。
1
2DataFrame.to_excel(excel_writer=None, sheetname=None, header=True, index=True, index_label=None, mode=’w’, encoding=None)
(3)读取与存储JSON
1
2
3
4# 通过json模块转换为字典,再转换为DataFrame df = pd.read_json('./test.json') print(df)
1
2
3
4
5with open("test.json","r") as f: data = json.loads(f.read()) df = pd.DataFrame(data) print(df)
最后
以上就是怕孤单电源最近收集整理的关于科学计算库 —— Pandas之DataFrame1 DataFrame介绍2 创建DataFrame3 常用属性4 访问数据5 处理重复数据6 删除数据7 添加数据8 修改数据9 缺失值处理10 分组11 聚合12 排序13 统计14 数据表关联15 索引设置16 数据的读取与存储的全部内容,更多相关科学计算库内容请搜索靠谱客的其他文章。
发表评论 取消回复