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表示字段之间的分隔符为逗号(默认 值)。
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
二、查看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
四、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
结束
|