找回密码
 会员注册
查看: 32|回复: 0

pandas中DataFrame用法(python)

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64965
发表于 2024-9-4 09:19:25 | 显示全部楼层 |阅读模式
简介DataFrame一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。其结构图示意图,如下所示:表格中展示了某个销售团队个人信息和绩效评级(rating)的相关数据。数据以行和列形式来表示,其中每一列表示一个属性,而每一行表示一个条目的信息。DataFrame的每一行数据都可以看成一个Series结构,只不过,DataFrame为这些行中每个数据值增加了一个列标签。因此DataFrame其实是从Series的基础上演变而来。在数据分析任务中DataFrame的应用非常广泛,因为它描述数据的更为清晰、直观。同Series一样,DataFrame自带行标签索引,默认为“隐式索引”即从0开始依次递增,行标签与DataFrame中的数据项一一对应。下面对DataFrame数据结构的特点做简单地总结,如下所示:DataFrame每一列的标签值允许使用不同的数据类型;DataFrame是表格型的数据结构,具有行和列;DataFrame中的每个数据值都可以被修改;DataFrame结构的行数、列数允许增加或者删除;DataFrame有两个方向的标签轴,分别是行标签和列标签;DataFrame可以对行和列执行算术运算。创建DataFrame对象基本语法importpandasaspdpd.DataFrame(data,index,columns,dtype,copy)参数说明参数名称说明data输入的数据,可以是ndarray,series,list,dict,标量以及一个DataFrame。index行标签,如果没有传递index值,则默认行标签是np.arange(n),n代表data的元素个数。columns列标签,如果没有传递columns值,则默认列标签是np.arange(n)。dtypedtype表示每一列的数据类型。copy默认为False,表示复制数据data。事先说明由于我是在jupyternotebook上写的代码,先导入库,后面写代码就不需要导入了。所以下面所有的代码,都是没有导入库。如果要copy的话,请加上下面的代码。#导入库importpandasaspdimportnumpyasnpimportmatplotlib列表创建DataFrame对象#列表创建DATaFrame对象#单一列表data=np.arange(5)df=pd.DataFrame(data)print(df)嵌套列表创建#使用嵌套列表创建DataFrame对象data=[['tom',10],['marry',20],['bill',30]]df=pd.DataFrame(data,columns=['name','age'])print(df)字典嵌套列表创建数据data字典中,键对应的值的元素长度必须相等(也就是列表长度相同)#字典嵌套列表创建data={"name":["Alex","Biil","Amy"],"age":[10,20,30]}df=pd.DataFrame(data)print(df)字典嵌套列表,自定义行标签#字典嵌套列表,自定义行标签data={"name":["Alex","Biil","Amy"],"age":[10,20,30]}index=["num1","num2","num3"]df=pd.DataFrame(data,index=index)print(df)列表嵌套字典创建列表嵌套字典可以作为输入数据传递给DataFrame构造函数。默认情况下,字典的键被用作列名。#列表嵌套字典创建data=[{'a':1,'b':2},{'a':5,'b':10,'c':20}]df=pd.DataFrame(data)print(df)注意:如果其中某个元素值缺失,也就是字典的key无法找到对应的value,将使用NaN代替。字典嵌套列表,自定义行/列标签#字典嵌套列表以及行,列索引表创建一个DataFrame对象data=[{'a':1,'b':2},{'a':5,'b':10,'c':20}]df1=pd.DataFrame(data,index=['first','second'],columns=['a','b'])df2=pd.DataFrame(data,index=['first','second'],columns=['a','b1'])df3=pd.DataFrame(data,index=['first','second'],columns=['a','b','c'])print(df1)print("-"*50)print(df2)print("-"*50)print(df3)以字典形式的Series创建传递一个字典形式的Series,从而创建一个DataFrame对象,其输出结果的行索引是所有index的合集。#以字典形式的Series创建d={'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(d)print(df)注意:对于one列而言,此处虽然显示了行索引'd',但由于没有与其对应的值,所以它的值为NaN。总结创建的方法有很多种,这里只是列举几种常见常用的。很多人容易被列表和字典两种类型的嵌套的搞混,一开始我也看的非常迷茫,后来看出一点规律了。列表[]里面是一行数据,字典{}里面是一列数据。字典里的键就是DataFrame里的列标签每多一个嵌套列表就多一行数据,每多一个嵌套字典就多一列数据列索引操作DataFrameDataFrame可以使用列索(columnsindex)引来完成数据的选取、添加和删除操作。下面依次对这些操作进行介绍。列索引选取数据列#使用列索引实现数据获取d={'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(d)print(df['one'])列索引添加数据#使用列索引添加数据d={'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(d)#使用df['列']=值,插入新的数据列df['three']=pd.Series([10,20,30],index=['a','b','c'])print(df)#将已经存在的数据列做相加运算df['four']=df['one']+df['three']print(df)#使用insert方法插入新的列info=[['Jack',18],['Helen',19],['John',17]]df=pd.DataFrame(info,columns=['name','age'])print(df)print("-"*50)#注意是column参数#数值1代表插入到columns列表的索引位置df.insert(1,column='score',value=[91,90,75])print(df)使用列标签可以直接添加数据,只不过只能添加在末尾使用insert添加数据,可以指定添加在哪一列列索引删除数据列#使用del和pop删除数据列d={'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d']),'three':pd.Series([10,20,30],index=['a','b','c'])}df=pd.DataFrame(d)print("Ourdataframeis:")print(df)print("-"*50)#使用del删除deldf['one']print(df)print("-"*50)#使用pop方法删除df.pop('two')print(df)使用del和pop都可以删除数据列,只不过两种使用方式有些不同,注意一下这里建议使用pop,因为pop是DataFrame的方法,而其他添加/删除数据行/列操作都是靠DataFrame方法来完成的,所以这里也用pop方法,和其他形成统一,不容易用错行索引操作DataFrame标签索引选取#标签索引选取d={'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(d)print(df)print("-"*50)#选取单个数据print(df.loc[["a"],["one"]])print("-"*50)#选取多个数据print(df.loc["a":"c","one":"two"])print("*-"*50)print(df.loc[["a","d"],["one"]])loc只接收标签索引,前面是行标签,后面是列标签,都是传列表(但是使用:时,不要传列表,直接使用即可)。选取多个数据的切片和Series差不多整数索引选取#整数索引选取d={'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(d)print(df)print("-*-"*50)#选取单个数据print(df.iloc[[1],[1]])print("-"*50)#选取多个数据print(df.iloc[1:3,0:1])print("-"*50)print(df.iloc[[0,2],[1]])iloc只接收整数索引,前面表示行,后面表示列,都是从零开始计数的,都是传列表(但是使用:时,不要传列表,直接使用即可)。选取多个数据的切片和Series差不多切片操作多行选取#切片选取多行d={'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(d)print(df)print("-"*50)#左闭右开print(df[2:4])添加数据行#使用append添加数据行,添加到末尾(这个在pandas2.0之后被移除了)#使用concat拼接两个DataFramedf=pd.DataFrame([[1,2],[3,4]],columns=['a','b'])df2=pd.DataFrame([[5,6],[7,8]],columns=['a','b'])print(df)print("-"*50)print(df2)print("-"*50)#在行末追加新数据行#df=df.append(df2)df=pd.concat([df,df2])print(df)注意:在有些地方还使用append添加。然而在pandas2.0之后就被移除。我们可以使用concat来平替。删除数据#使用drop方法删除行数据df=pd.DataFrame([[1,2],[3,4]],columns=['a','b'])df2=pd.DataFrame([[5,6],[7,8]],columns=['a','b'])df=pd.concat([df,df2])print(df)print("-"*50)#注意此处调用了drop()方法df=df.drop(0)print(df)常用属性和方法DataFrame和Series差不多名称属性&方法T行和列转置。axes返回一个仅以行轴标签和列轴标签为成员的列表。dtypes返回每列数据的数据类型。emptyDataFrame中没有数据或者任意坐标轴的长度为0,则返回True。ndim轴的数量,也指数组的维数。(都是2)shape返回一个元组,表示了DataFrame维度。sizeDataFrame中的元素数量。values使用numpy数组表示DataFrame中的元素值。head()返回前n行数据。tail()返回后n行数据。shift()将行或列移动指定的步幅长度代码演示#创建d={'Name':pd.Series(['c语言中文网','编程帮',"百度",'360搜索','谷歌','微学苑','Bing搜索']),'years':pd.Series([5,6,15,28,3,19,23]),'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}#构建DataFramedf=pd.DataFrame(d)#输出DataFrameprint(df)print("-"*50)#转置print(df.T)print("-"*50)#axesprint(df.axes)print("-"*50)#dytpeprint(df.dtypes)print("-"*50)#emptyprint(df.empty)print("-"*50)#ndimprint(df.ndim)print('-'*50)#shapeprint(df.shape)print("-"*50)#sizeprint(df.size)print("-"*50)#valuesprint(df.values)print("-"*50)#head和tailprint(df.head(3))print("-"*50)print(df.tail(2))print("-"*50)#shiftinfo=pd.DataFrame({'a_data':[40,28,39,32,18],'b_data':[20,37,41,35,45],'c_data':[22,17,11,25,15]})#移动幅度为3info.shift(periods=3)print(info)print("-"*50)info.shift(periods=3,axis=1,fill_value=52)print(info)关于这个shift,我也没有搞明白,等啥时候我搞明白了再回来补吧总结具体参考C语言中文网数据分析和可视化到这就告一段落,把这些知识大致过一遍就可以了后面去学机器学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-29 11:05 , Processed in 1.050699 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表