python数据分析2:DataFrame对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python数据分析2:DataFrame对象相关的知识,希望对你有一定的参考价值。
参考技术A DataFrame对象:二维表数据结构,由行列数据组成的表格常用index表示行,columns表示列
'''
语文 数学 英语
0 110 105 99
1 105 88 115
2 109 120 130
'''
# print(df.columns) # Index(['语文', '数学', '英语'], dtype='object')
# print(df.index) # Int64Index([0, 1, 2], dtype='int64')
# 遍历DataFrame数据的每一列
'''
0 110
1 105
2 109
Name: 语文, dtype: int64
0 105
1 88
2 120
Name: 数学, dtype: int64
0 99
1 115
2 130
Name: 英语, dtype: int64
'''
1.创建一个DataFrame对象
pandas.DataFrame(data,index,columns,dtype,copy)
# data表示数据,可以是ndarray数组,series对象、列表、字典等
# index表示行标签(索引)
# columns表示列标签(索引)
# dtype每一列数据的数据类型
# copy用于复制数据
# 返回值DataFrame
通过二维数组创建成绩表
'''
语文 数学 英语
0 110 105 99
1 105 88 115
2 109 120 130
'''
2.通过字典创建DataFrame对象
value值只能是一维数组或单个的简单数据类型
# 数组,则要求所有的数组长度一致
# 单个数据,每行都需要添加相同数据
'''
语文 数学 英语 班级
0 110 105 109 高一7班
1 105 88 120 高一7班
2 99 115 130 高一7班
'''
'''
【DataFrame属性】
values 查看所有元素的值 df.values
dtypes 查看所有元素的类型 df.dtypes
index 查看所有行名、重命名行名 df.index df.index=[1,2,3]
columns 查看所有列名、重命名列名 df.columns df.columns=['语','数']
T 行列数据转换 df.T
head 查看前n条数据,默认5条 df.head() df.head(10)
tail 查看后n条数据,默认5条 df.tail() df.tail(10)
shape 查看行数和列数,[0]表示行,[1]表示列 df.shape[0] df.shape[1]
info 查看索引,数据类型和内存信息 df.info
【DataFrame函数】
describe 查看每列的统计汇总信息,DataFrame类型 df.describe()
count 返回每一列中的非空值的个数 df.count()
sum 返回每一列和和,无法计算返回空值 df.sum()
max 返回每一列的最大值 df.max()
min 返回每一列的最小值 df.min()
argmax 返回最大值所在的自动索引位置 df.argmax()
argmin 返回最小值所在的自动索引位置 df.argmin()
idxmax 返回最大值所在的自定义索引位置 df.idxmax()
idxmin 返回最小值所在的自定义索引位置 df.idxmin()
mean 返回每一列的平均值 df.mean()
median 返回每一列的中位数 df.median()
var 返回每一列的方差 df.var()
std 返回每一列的标准差 df.std()
isnull 检查df中的空值,空值为True,否则为False,返回布尔型数组 df.isnull()
notnull 检查df中的空值,非空值为True,否则为False,返回布尔型数组 df.notnull()
中位数又称中值,是指按顺序排列的一组数据中居于中间位置的数
方差用于度量单个随机变量的离散程序(不连续程度)
标准差是方差的算术平方根,反映数据集的离散程度
'''
3. 导入.xls或.xlsx文件
# pandas.read_excel(io,sheetname=0,header=0,names=None,index_col=None,usecols=None,squeeze=False,dtype=None,engine=None,converters=None,true_values=None,false_values=None,skiprows=None,nrow=None,na_values=None,keep_defalut_na=True,verbose=False,parse_dates=False,date_parser=None,thousands=None,comment=None,skipfooter=0,conver_float=True,mangle_dupe_cols=True,**kwds)
'''
io 字符串,xls或xlsx文件路径或类文件对象
sheet_name:None、字符串、整数、字符串列表或整数列表,默认值为0
字符串用于工作表名称;整数为索引,表示工作表位置
字符串列表或整数列表用于请求多个工作表,为None时则获取所有的工作表
sheet_name = 0 第一个Sheet页中的数据作为DataFrame对象
sheet_name = 1 第二个Sheet页中的数据作为DataFrame对象
sheet_name = 'Sheet1' 名为Sheet1的Sheet页中的数据作为DataFrame对象
sheet_name = [0,1,'Sheet3'] 第一个,第二个和名为Sheet3的Sheet页中的数据作为DataFrame对象
header:指定作为列名的行,默认值为0,即取第一行的值为列名。或数据不包含列名,则为header=None
names:默认值为None,要使用的列名列表
index_col:指定列为索引列,默认值为None,索引0是DataFrame对象的行标签
usecols:int、list或字符串,默认值为None
如为None,则解析所有列
如为int,则解析最后一列
如为list列表,则解析列号和列表的列
如为字符串,则表示以逗号分隔的Excel列字母和列范围列表
squeeze:布尔值,默认为False,如果解析的数据只包含一列,则返回一个Series
dtype:列的数据类型名称为字典,默认值为None
skiprows:省略指定行数的数据,从第一行开始
skipfooter:省略指定行数的数据,从尾部数的行开始
4.导入指定Sheet页的数据
# sheet_name=0表示第一个sheet页的数据,以此类推,如果不指定,则导入第一页
5.指定行索引导入Excel数据
'''
Empty DataFrame
Columns: []
Index: [1, 3, 5]
'''
# 导入第一列数据
'''
Empty DataFrame
Columns: []
Index: [1, 3, 5]
'''
Python3 DataFrame数据详解
pandas的DataFrame极大地简化了数据分析过程中一些烦琐操作,它是一个表格型的数据结构, 每一列代表一个变量,而每一行则是一条记录。简答地说,DataFrame是共享同一个index 的Series的集合。
一、创建DataFrame对象
1、手动创建
DataFrame对象的创建方法与Series对象类似,只不过可以同时接受多条一维的列表, 每个列表都会成为单独的一列。在创建DataFYame对象之前,要先创建一个索引。索引是 一个DataFrame对象必须有的元素,起到标识的作用。
import numpy as np
import pandas as pd
dates = ['2016-01-01','2016-01-02','2016-01-03','2016-01-04','2016-01-05','2016-01-06']
dates=pd.to_datetime(dates)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
df
Out[5]:
A B C D
2016-01-01 1.006510 1.678675 -0.156752 0.444550
2016-01-02 1.852856 -1.751584 0.720768 2.461106
2016-01-03 -0.800489 0.551971 0.330224 -1.446671
2016-01-04 0.335725 0.233649 -0.488270 -0.768260
2016-01-05 0.171777 0.029941 -1.627771 -0.375686
2016-01-06 0.527360 -0.405248 -0.431333 -0.051660
df2 = pd.DataFrame('c1':['apple']*3+['banana']*3+['apple'],'c2':['a','a',3,3,'b','b','a'])
df2
Out[3]:
c1 c2
0 apple a
1 apple a
2 apple 3
3 banana 3
4 banana b
5 banana b
6 apple a
2、read_table()函数
对 于 多 数 常 见 的 存 储 数 据 的 文 件 , 比 如 . t x t 文 件 或 是 . C S V 文 件 , 都 可 以 用 read_table()函数来处理,该函数的调用形式为:
pd.read_table('data_flie', sep='\\t *, header=None, names=None)
上面代码中的参数是几个比较常见的参数,其中• datable(指定了需要读入的文档 (包含路径);sep='b表示字段之间的分隔符为Tab分隔符(此为默认取值);header是 指用作列名(变量名)的行数,比如header=0 (默认取值)指的是第0行的数据用来做列 名,header=None是指没有列名;names可以指定各列变量名,如果header=0则说明将第 0行作为列名,此时可以将names取值为None。read_table()函数还有很多参数,有兴趣读者可以自行翻阅文档来查看该函数的所有参数及用法。
3、读取csv文件数据
Pandas库中还有一个专门处理csv文件的函数read_csv(),该函数与read_table() 的参数十分类似。假设我们要读取test.csv中的数据,对应的代码如下:
df = pd.read_csv('filepath/test.csv', header=None, sep=',')
其中,filepath是test.csv文件所在的路径,比如在D盘的data文件夹里,则filepath 为D:/data; header=None表示没有列表名,sep=',1表示字段之间的分隔符为逗号(默认 值)。
另外,我们可以通过pd.to_csv()函数讲数据导成csv文件
4、读取MySQL数据
要读取MySQL中的数据,首先要安装Pandas支持的MySQL驱动,MySQL and MariaDB — SQLAlchemy 1.4 Documentation列出 了所有支持的 MySQL 驱动。下 面以MySQLdb包为例来说明一下Pandas读取MySQL数据的方法。假设数据库stock安装在本地,用户名为root,密码为pwdl23,要读取stock数据库中的数据,对应的代码如
import pandas as pd
import MySQLdb
mysql_cn= MySQLdb.connect(host='localhost' , port=3306,user='root' , passwd='pwdl23',db='stock')
#stock数据库有两张表,分别为stock和company
#现在我们要从company表中读10笔资料
df=pd.read_sql('select * from company limit 10;' , con=mysql_cn)
mysql_cn.close()
上面的代码读取了 stock数据库company表中的10笔数据到df中,得到的df的数据结构为 Dataframe
5、读写Excel文件数据
我们可以先安装openpyxl包,然后使用pd.read_excel()和pd.to_excel()完成Excel文件的读写。
二、查看DataFrame数据
我们可以通过head(),tail(),等方式查看DataFrame对象。
pro = ts.pro_api()
df = pro.daily(ts_code='600036.Sh', start_date='20220101', end_date='20220508')
df
df.head(20)
df.tail(20)
df.columns
df.values()
三、DataFrame数据切片
1、根据行和列进行单独切片
#对行进行切边
df[1:3]
#提取单独一列
df['open']
#提取多列
df['open','close','higt','low']
#根据boolean值进行条件提取
df[df['open']<df['close']]
2、通过标签索引和切片
可以通过行和列的标签名来提取相应的数据,主要是运用df.loc[row_indexer, column_ indexer]进行操作:
import numpy as np
import pandas as pd
dates = ['2022-01-01','2022-01-02','2022-01-03','2020-01-04','2022-01-05','2022-01-06']
df = pd.DataFrame(np.random.randn(6,4),index=pd.to_datetime(dates),columns=list('ABCD'))
df
Out[20]:
A B C D
2022-01-01 0.913514 -0.730723 0.955370 -0.058252
2022-01-02 -0.971986 -2.042502 -0.030837 -0.598257
2022-01-03 -0.631342 -0.053240 2.327449 -0.690162
2020-01-04 1.206026 -0.604635 -0.041982 -1.108210
2022-01-05 -0.211006 -0.615417 -0.478857 1.036294
2022-01-06 1.372739 -0.161088 -0.308481 -0.091903
#提取某一列数据
df.loc[:,"A"]
#提取几列数据
df.loc[:,"A":"C"]
#提取特定的行和列
df.loc[dates[0:2],"A":"C"]
Out[21]:
A B C
2022-01-01 0.913514 -0.730723 0.955370
2022-01-02 -0.971986 -2.042502 -0.030837
#提取特定的标量
df.loc[dates[0],"A"]
Out[23]:
2022-01-01 0.913514
Name: A, dtype: float64
#根据boolean值进行条件提取
df.loc[df.loc[:,"A"]>0]
3、通过位置索引与切片
通过位置提取特定的数据与通过标签切片类似:
#提取某行数据
df.iloc[2]
#提取某列数据
df.iloc[:2]
#提取1行和4行的第2列及第3列的数据
df.iloc[[1,4],[2,3]]
#切片
df.iloc[1:4,2:3]
#提取特定标量
df.iloc[3,3]
df.iat[3,3]
#根据bolean值进行条件提取
df.loc[:,df.iloc[3]>0]
三、DataFrame数据操作
1、数据转置
DataFrame数据结构是二维的,二维数据常常要用到的操作是转置:
df.T
Out[37]:
2022-01-01 2022-01-02 2022-01-03 2020-01-04 2022-01-05 2022-01-06
A 0.913514 -0.971986 -0.631342 1.206026 -0.211006 1.372739
B -0.730723 -2.042502 -0.053240 -0.604635 -0.615417 -0.161088
C 0.955370 -0.030837 2.327449 -0.041982 -0.478857 -0.308481
D -0.058252 -0.598257 -0.690162 -1.108210 1.036294 -0.091903
2、排序与排名
DataFrame中的排序分为三类,索引排序:sort_index();值排序:sort_values();值排名:rank()
具体请参考《Python3 DataFrame数据排序与排名》
3、增加行或者列
有时我们需要将两个数据集合并在一起,可能会往横的方向上接续更多的列,也可能 在纵的方向上拼接更多的行。在列的方向上操作时,数据集会自动根据index对齐;在行 的方向操作时,数据集会自动根据列的名对齐。
dates = ['2022-01-01','2022-01-02','2022-01-03','2022-01-04','2022-01-05','2022-01-06']
dates=pd.to_datetime(dates)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
S=pd.Series([1,3,5,7,9,11], index=pd.date_range('2022-01-02',periods=6))
S
Out[88]:
2022-01-02 1
2022-01-03 3
2022-01-04 5
2022-01-05 7
2022-01-06 9
2022-01-07 11
#增加一列
df['E']=S
df
Out[90]:
A B C D E
2022-01-01 0.173343 -0.817664 0.178729 1.146641 NaN
2022-01-02 -1.066184 0.132529 -0.438496 -0.207708 1.0
2022-01-03 0.869305 0.656714 -1.296309 -1.881551 3.0
2022-01-04 -0.379470 0.746313 2.361470 0.823606 5.0
2022-01-05 0.197038 0.802556 -0.208116 0.858625 7.0
2022-01-06 -2.258262 -3.090186 -0.861053 -0.249618 9.0
3、合并操作
df=df[list('ABCD')]
#横向合并操作
pd.concat([df,S],axis=1)
Out[95]:
A B C D 0
2022-01-01 0.173343 -0.817664 0.178729 1.146641 NaN
2022-01-02 -1.066184 0.132529 -0.438496 -0.207708 1.0
2022-01-03 0.869305 0.656714 -1.296309 -1.881551 3.0
2022-01-04 -0.379470 0.746313 2.361470 0.823606 5.0
2022-01-05 0.197038 0.802556 -0.208116 0.858625 7.0
2022-01-06 -2.258262 -3.090186 -0.861053 -0.249618 9.0
2022-01-07 NaN NaN NaN NaN 11.0
df2=pd.DataFrame('A':[1,2,3],'B':[1,2,3],'C':[1,2,3],index=pd.date_range('2022-02-01',periods=3))
#纵向合并操作
df.append(df2)
Out[97]:
A B C D
2022-01-01 0.173343 -0.817664 0.178729 1.146641
2022-01-02 -1.066184 0.132529 -0.438496 -0.207708
2022-01-03 0.869305 0.656714 -1.296309 -1.881551
2022-01-04 -0.379470 0.746313 2.361470 0.823606
2022-01-05 0.197038 0.802556 -0.208116 0.858625
2022-01-06 -2.258262 -3.090186 -0.861053 -0.249618
2022-02-01 1.000000 1.000000 1.000000 NaN
2022-02-02 2.000000 2.000000 2.000000 NaN
2022-02-03 3.000000 3.000000 3.000000 NaN
#内联合并操作
pd.concat([df,df2],join='inner')
Out[99]:
A B C
2022-01-01 0.173343 -0.817664 0.178729
2022-01-02 -1.066184 0.132529 -0.438496
2022-01-03 0.869305 0.656714 -1.296309
2022-01-04 -0.379470 0.746313 2.361470
2022-01-05 0.197038 0.802556 -0.208116
2022-01-06 -2.258262 -3.090186 -0.861053
2022-02-01 1.000000 1.000000 1.000000
2022-02-02 2.000000 2.000000 2.000000
2022-02-03 3.000000 3.000000 3.000000
4、删除操作
#删除行数据
df.drop(dates[1:3])
Out[101]:
A B C D
2022-01-01 0.173343 -0.817664 0.178729 1.146641
2022-01-04 -0.379470 0.746313 2.361470 0.823606
2022-01-05 0.197038 0.802556 -0.208116 0.858625
2022-01-06 -2.258262 -3.090186 -0.861053 -0.249618
#删除列数据
df.drop('D',axis=1),
Out[102]:
( A B C
2022-01-01 0.173343 -0.817664 0.178729
2022-01-02 -1.066184 0.132529 -0.438496
2022-01-03 0.869305 0.656714 -1.296309
2022-01-04 -0.379470 0.746313 2.361470
2022-01-05 0.197038 0.802556 -0.208116
2022-01-06 -2.258262 -3.090186 -0.861053,)
del df['C']
df
Out[105]:
A B D
2022-01-01 0.173343 -0.817664 1.146641
2022-01-02 -1.066184 0.132529 -0.207708
2022-01-03 0.869305 0.656714 -1.881551
2022-01-04 -0.379470 0.746313 0.823606
2022-01-05 0.197038 0.802556 0.858625
2022-01-06 -2.258262 -3.090186 -0.249618
5、数据数值更新
有时我们需要将数据集中的某个或者某些值替换、更新,即先找到要替换的数据所在的位置(通过位置索引或者标签索引),然后赋予新的值:
df.loc[dates[2],'A']=100
df.iloc[3,2]=32
df.loc[:,'B']=np.arange(0,len(df))
df
Out[116]:
A B D
2022-01-01 0.173343 0 1.146641
2022-01-02 -1.066184 1 -0.207708
2022-01-03 100.000000 2 -1.881551
2022-01-04 -0.379470 3 32.000000
2022-01-05 0.197038 4 0.858625
2022-01-06 -2.258262 5 -0.249618
6、重置索引:
如果对DataFrame对象df调用reindex()函数,将返回一个新的对象,该对象的index 和列名由reindex()函数传入的参数设定。如果新对象的某个索引值或列名不存在于原对象df中,则引入缺失值。具体见下面的例子:
dates = ['2022-01-01','2022-01-02','2022-01-03','2022-01-04','2022-01-05','2022-01-06']
dates=pd.to_datetime(dates)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
new_index=pd.date_range('2022-01-01',periods=10)
df.reindex(new_index,columns=list("ABCDE"))
Out[126]:
A B C D E
2022-01-01 -0.347887 -0.229641 1.373393 -1.195988 NaN
2022-01-02 -1.290596 0.101610 -0.926032 -0.393712 NaN
2022-01-03 0.550675 0.941960 -0.858507 -0.479702 NaN
2022-01-04 1.714638 -0.922391 0.347594 -1.227856 NaN
2022-01-05 -2.124143 1.723963 2.084947 1.421752 NaN
2022-01-06 -1.082870 0.329412 0.819416 -0.249792 NaN
2022-01-07 NaN NaN NaN NaN NaN
2022-01-08 NaN NaN NaN NaN NaN
2022-01-09 NaN NaN NaN NaN NaN
2022-01-10 NaN NaN NaN NaN NaN
另外,我们可以通过df.set_index("date")的形式来设置索引。
四、DataFrame数据运算
关于此的更多内容,请参考《Python3 DataFrame数据运算》
五、DataFrame缺失数值处理
关于此的更多内容,请参考《Python3 DataFrame缺失值的处理》
六、删除重复数据
有时我们处理的数据会因为数据源头或者后续处理不当而出现重复数据,这样既会占据额外的储存空间,也可能会影响分析结果。
df5 = pd.DataFrame('c1':['apple']*3+['banana']*3+['apple'],'c2':['a','a',3,3,'b','b','a'])
df5
Out[3]:
c1 c2
0 apple a
1 apple a
2 apple 3
3 banana 3
4 banana b
5 banana b
6 apple a
Pandas包里有直接处理重复数据的函数。DataFrame对象调用duplicated()可以得到一个bool型的Series,表示各行是否是重复行。
df5.duplicated()
Out[4]:
0 False
1 True
2 False
3 False
4 False
5 True
6 True
如果发现数据中有重复行,可以调用drop_duplicates()函数,来移除重复行:
df5.drop_duplicates()
Out[6]:
c1 c2
0 apple a
2 apple 3
3 banana 3
4 banana b
以上两个方法是以默认的方式判断全部的列(上面的例子中是看两个变量
cl
和
c2
是
否都是重复出现),我们也可以对特定的列进行重复项的判断。
df5.duplicated('c2')
Out[7]:
0 False
1 True
2 False
3 True
4 False
5 True
6 True
df5.drop_duplicates('c2')
Out[8]:
c1 c2
0 apple a
2 apple 3
4 banana b
结束
以上是关于python数据分析2:DataFrame对象的主要内容,如果未能解决你的问题,请参考以下文章
100天精通Python(数据分析篇)——第55天:Pandas之DataFrame对象大总结
数据分析——python,pandas:DataFrame对象(merge函数,fillna函数的使用)排序