Pandas学习
来源:互联网 发布:龙泉驿广电网络全称 编辑:程序博客网 时间:2024/06/06 08:30
Series和DataFrame是Pandas中最重要的两个数据结构,Series类似numpy中的一维数组,DataFrame类似numpy中的二维数据,它们除了可以使用numpy中的方法外,还增加了索引这个功能,DataFrame中有行的index和列的index。
1、创建Series
Series除了包含一个数组外,还有一个对数组每个元素的一个index索引,这个索引默认从0开始,当然也可以自己定义。
- 通过一个列表创建Series
s = pd.Series([11,22,33,"fgfff",np.nan])print(s)# 0 11# 1 22# 2 33# 3 fgfff# 4 NaN# dtype: object
左边就是默认的索引,从0开始
- 通过列表创建Series,同时指定一个index
s = pd.Series([2,3,5,4,3,6,5,3],index["一","二","三","四","五","六","七","八"])print(s)# 一 2# 二 3# 三 5# 四 4# 五 3# 六 6# 七 5# 八 3# dtype: int64
- 使用一个日期来所谓index
date = pd.date_range("2017-1-1",periods=8)s = pd.Series([2,3,5,4,3,6,5,3],index=date)print(s)# 2017-01-01 2# 2017-01-02 3# 2017-01-03 5# 2017-01-04 4# 2017-01-05 3# 2017-01-06 6# 2017-01-07 5# 2017-01-08 3
- 通过index和values来查看Series的index和元素
date = pd.date_range("2017-1-1", periods=8) s = pd.Series([2, 3, 5, 4, 3, 6, 5, 3], index=date) print(s.index) print(s.values) # DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04', # '2017-01-05', '2017-01-06', '2017-01-07', '2017-01-08'], # dtype='datetime64[ns]', freq='D') # [2 3 5 4 3 6 5 3]
注意:在创建Series的时候,传递的index的数量和数组元素的数量必须一致,index中可以由重复的index。
2、创建DataFrame
DataFrame和numpy的二维数组类似,它在行和列上都有索引,类似excel一样。
传递一个二维数组可以创建一个DataFrame
data = pd.DataFrame(np.arange(0, 12).reshape((3, 4)))print(data)# 0 1 2 3#0 0 1 2 3#1 4 5 6 7#2 8 9 10 11
也可以指定index和columns。
data = pd.DataFrame(np.arange(0,12).reshape((3,4)), index=pd.date_range("2017-1-1",periods=3), columns=["A","B","C","D"])print(data)# A B C D# 2017-01-01 0 1 2 3# 2017-01-02 4 5 6 7# 2017-01-03 8 9 10 11
和Series类似,也可以使用字典来创建DataFrame
data = pd.DataFrame({"A":[1,2,3], "B":["呵呵","哈哈","嘿嘿"], "C":["昨天","今天","明天"]})print(data)# A B C# 0 1 呵呵 昨天# 1 2 哈哈 今天# 2 3 嘿嘿 明天
这种方式创建的DataFrame,可以看到index是默认的,我们换一种方式让index和columns都是自定义的。
data = pd.DataFrame({"A":{"a":1,"b":2,"c":3}, "B":{"a":"呵呵","b":"哈哈","c":"嘿嘿"}, "C":{"a":"昨天","b":"今天","c":"明天"}})print(data) A B Ca 1 呵呵 昨天b 2 哈哈 今天c 3 嘿嘿 明天
同样可以使用index、columns和values来查看索引和数组元素
print(data.index)print(data.columns)print(data.values)# Index(['a', 'b', 'c'], dtype='object')# Index(['A', 'B', 'C'], dtype='object')# [[1 '呵呵' '昨天']# [2 '哈哈' '今天']# [3 '嘿嘿' '明天']]
3、检索数据
我们先定义一个DataFrame的data
data = pd.DataFrame(np.arange(0,20).reshape((4,5)), index=pd.date_range("2017-9-9",periods=4), columns=["A","B","C","D","E"])print(data) A B C D E# 2017-09-09 0 1 2 3 4# 2017-09-10 5 6 7 8 9# 2017-09-11 10 11 12 13 14# 2017-09-12 15 16 17 18 19
- 查看列的数据
print(data["A"])# 2017-09-09 0# 2017-09-10 5# 2017-09-11 10# 2017-09-12 15# Freq: D, Name: A, dtype: int32 print(data.B)# 2017-09-09 1# 2017-09-10 6# 2017-09-11 11# 2017-09-12 16# Freq: D, Name: B, dtype: int32
- 查看行的数据
print(data[0:3])# A B C D E# 2017-09-09 0 1 2 3 4# 2017-09-10 5 6 7 8 9# 2017-09-11 10 11 12 13 14 print(data["2017-09-09":"2017-09-10"])# A B C D E# 2017-09-09 0 1 2 3 4# 2017-09-10 5 6 7 8 9
pandas还有一个loc和iloc的方法来索引行和列的数据,它们之间的区别是一个是用label来索引,一个是用int值的index来索引
使用loc()索引数据:
print(data.loc["2017-09-09"])# A 0# B 1# C 2# D 3# E 4# Name: 2017-09-09 00:00:00, dtype: int32#逗号前面指定行index,逗号后面指定列index,如何没有逗号后面的,默认所有列print(data.loc["2017-09-09",["A","C"]])# A 0# C 2# Name: 2017-09-09 00:00:00, dtype: int32
使用iloc()索引数据
print(data.iloc[0:3,0:3])# A B C# 2017-09-09 0 1 2# 2017-09-10 5 6 7# 2017-09-11 10 11 12 print(data.iloc[[0,2],[1,3]])# B D# 2017-09-09 1 3# 2017-09-11 11 13
还有一个方法ix(),它可以使用label和int的index混合进行索引。
print(data.ix[0:3,"A":"C"])# A B C# 2017-09-09 0 1 2# 2017-09-10 5 6 7# 2017-09-11 10 11 12print(data.ix[[0,3],["A","C"]])# A C# 2017-09-09 0 2# 2017-09-12 15 17
4、处理缺省值
定义一个DataFrame的data,我们将其某几项数据设置为Nan。
data = pd.DataFrame(np.arange(0, 20).reshape((4, 5)), index=pd.date_range("2017-9-9", periods=4), columns=["A", "B", "C", "D", "E"]) data.iloc[0,0] = np.nan data.iloc[2,1] = np.nan data.iloc[3] = np.nan print(data) # A B C D E# 2017-09-09 NaN 1.0 2 3 4# 2017-09-10 5.0 6.0 7 8 9# 2017-09-11 10.0 NaN 12 13 14# 2017-09-12 NaN NaN NaN NaN NaN
- 删除有缺省值的行或者列
#删除有Nan的这一行数据 print(data.dropna(axis=0, how="any"))# A B C D E# 2017-09-10 5.0 6.0 7.0 8.0 9.0 #删除整行都是Nan的一行数据 print(data.dropna(axis=0, how="all"))# A B C D E# 2017-09-09 NaN 1.0 2.0 3.0 4.0# 2017-09-10 5.0 6.0 7.0 8.0 9.0# 2017-09-11 10.0 NaN 12.0 13.0 14.0 #删除有Nan的这一列数据 print(data.dropna(axis=1, how="any"))#Empty DataFrame#Columns: []#Index: [2017-09-09 00:00:00, 2017-09-10 00:00:00, 2017-09-11 00:00:00, 2017-09-12 00:00:00] #删除整列都是Nan的一列数据 print(data.dropna(axis=1, how="all"))# A B C D E#2017-09-09 NaN 1.0 2.0 3.0 4.0#2017-09-10 5.0 6.0 7.0 8.0 9.0#2017-09-11 10.0 NaN 12.0 13.0 14.0#2017-09-12 NaN NaN NaN NaN NaN
- 替换缺省值
newData = data.fillna(value=0) print(newData) # A B C D E # 2017-09-09 0.0 1.0 2.0 3.0 4.0 # 2017-09-10 5.0 6.0 7.0 8.0 9.0 # 2017-09-11 10.0 0.0 12.0 13.0 14.0 # 2017-09-12 0.0 0.0 0.0 0.0 0.0
6、合并数据
- 使用concat()合并数据
data1 = pd.DataFrame(np.ones((2,3)),columns=["A","B","C"])data2 = pd.DataFrame(np.ones((3,3)) * 2,columns=["B","C","D"])data3 = pd.DataFrame(np.ones((4,3)) * 3,columns=["C","D","E"])print(pd.concat([data1,data2,data3],axis=0))# A B C D E#0 1.0 1.0 1.0 NaN NaN#1 1.0 1.0 1.0 NaN NaN#0 NaN 2.0 2.0 2.0 NaN#1 NaN 2.0 2.0 2.0 NaN#2 NaN 2.0 2.0 2.0 NaN#0 NaN NaN 3.0 3.0 3.0#1 NaN NaN 3.0 3.0 3.0#2 NaN NaN 3.0 3.0 3.0#3 NaN NaN 3.0 3.0 3.0print(pd.concat([data1,data2,data3],axis=1))# A B C B C D C D E#0 1.0 1.0 1.0 2.0 2.0 2.0 3.0 3.0 3.0#1 1.0 1.0 1.0 2.0 2.0 2.0 3.0 3.0 3.0#2 NaN NaN NaN 2.0 2.0 2.0 3.0 3.0 3.0#3 NaN NaN NaN NaN NaN NaN 3.0 3.0 3.0
在使用concat默认参数的时候,在原本没有数据的地方填充NaN,例如此处data1没有D和E这两列,在合并的时候,这两列就填充为NaN。
concat()有个默认的参数join=”outer”,该参数就是让原本没有的行或者列合并后填充为NaN,它还有一个inner参数,表示在合并的时候,如果有行和列对不上的,那么久忽略这些行和列。
print(pd.concat([data1,data2,data3],axis=0,join="inner"))# C#0 1.0#1 1.0#0 2.0#1 2.0#2 2.0#0 3.0#1 3.0#2 3.0#3 3.0print(pd.concat([data1,data2,data3],axis=1,join="inner"))# A B C B C D C D E#0 1.0 1.0 1.0 2.0 2.0 2.0 3.0 3.0 3.0#1 1.0 1.0 1.0 2.0 2.0 2.0 3.0 3.0 3.0
可以看到,如果合并的时候,某些行或者某些列不纯在的话就忽略了。
还有一个看着不爽的地方就是在合并完后,index都是各管各的,如果想让index连续怎么办呢,加上一个参数ignore_index=True就行了,这个参数默认是False。
print(pd.concat([data1,data2,data3],axis=0,join="inner",ignore_index=True)) # C #0 1.0 #1 1.0 #2 2.0 #3 2.0 #4 2.0 #5 3.0 #6 3.0 #7 3.0 #8 3.0print(pd.concat([data1,data2,data3],axis=1,join="inner",ignore_index=True)) # 0 1 2 3 4 5 6 7 8 #0 1.0 1.0 1.0 2.0 2.0 2.0 3.0 3.0 3.0 #1 1.0 1.0 1.0 2.0 2.0 2.0 3.0 3.0 3.0
- 使用append()合并数据
append和python中list的append类似,在行的末尾添加一行。不过它没有类似concat()的join参数可以忽略不匹配的行或者列
print(data1.append([data2,data3]))# A B C D E#0 1.0 1.0 1.0 NaN NaN#1 1.0 1.0 1.0 NaN NaN#0 NaN 2.0 2.0 2.0 NaN#1 NaN 2.0 2.0 2.0 NaN#2 NaN 2.0 2.0 2.0 NaN#0 NaN NaN 3.0 3.0 3.0#1 NaN NaN 3.0 3.0 3.0#2 NaN NaN 3.0 3.0 3.0#3 NaN NaN 3.0 3.0 3.0
- 使用merge()合并数据
先定义两组数据
data1 = pd.DataFrame(np.arange(12).reshape((3,4)),index=[1,2,3],columns=["A","B","C","D"])data2 = pd.DataFrame(np.arange(20).reshape((5,4)),index=[2,3,4,5,6],columns=["B","C","D","E"])print(data1)print(data2)# A B C D# 1 0 1 2 3# 2 4 5 6 7# 3 8 9 10 11# # A B C D# 1 0 1 2 3# 2 4 5 6 7# 3 8 9 10 11# 4 12 13 14 15# 5 16 17 18 19
如果只传入数组,不传其他的参数,默认只合并相同的部分,类似于取交集
print(pd.merge(data1,data2))# A B C D# 0 0 1 2 3# 1 4 5 6 7# 2 8 9 10 11
可以指定on参数,参考哪些列来合并,这里B和C两列的前3项一样,就合并这3项。
print(pd.merge(data1,data2,on=["B","C"]))# A_x B C D_x A_y D_y# 0 0 1 2 3 0 3# 1 4 5 6 7 4 7# 2 8 9 10 11 8 11
可以看到多了一个x和y的后缀,因为合并的时候,前一个数组的列和后一个数组的列的index相同,所以使用了这么一个后缀,我们可以指定这个后缀。
print(pd.merge(data1,data2,on=["B","C"],suffixes=["-前","-后"]))# A-前 B C D-前 A-后 D-后# 0 0 1 2 3 0 3# 1 4 5 6 7 4 7# 2 8 9 10 11 8 11
merge()还有一个默认参数how=”inner”,类似于concat的join参数,不过这里它有4种可选值:left、right、inner、outer
print(pd.merge(data1,data2,on=["B","C"],how="left")) # A_x B C D_x A_y D_y # 0 0 1 2 3 0 3 # 1 4 5 6 7 4 7 # 2 8 9 10 11 8 11 print(pd.merge(data1,data2,on=["B","C"],how="right")) # A_x B C D_x A_y D_y # 0 0.0 1 2 3.0 0 3 # 1 4.0 5 6 7.0 4 7 # 2 8.0 9 10 11.0 8 11 # 3 NaN 13 14 NaN 12 15 # 4 NaN 17 18 NaN 16 19 print(pd.merge(data1,data2,on=["B","C"],how="outer"))# A_x B C D_x A_y D_y#0 0.0 1 2 3.0 0 3#1 4.0 5 6 7.0 4 7#2 8.0 9 10 11.0 8 11#3 NaN 13 14 NaN 12 15#4 NaN 17 18 NaN 16 19
从结果就可以看到它们的区别:left表示合并的时候只参考左边的列,right表示合并的时候只参考右边的列,如果是inner的话就是左边和右边的列要一样才合并,outer的话就是取并集一样只要有就合并,如果没有数据在对应位置就不上NaN即可。
7、画图
Pandas还可以使用plot()进行画图操作,将Series或者DataFrame中的数据画成图片,不过它使用的还是matplotlib这个库进行操作的,pandas本身只是一个数据计算操作的库。至于matplotlib这个库的使用,我们后面单独来讲解matplotlib的使用。
- pandas 学习
- Pandas学习
- pandas学习
- Pandas学习笔记:pandas基础
- pandas学习笔记(1)--pandas简介
- Pandas学习笔记一(Pandas数据结构)
- pandas学习(三)
- pandas 学习笔记
- pandas 模块学习
- pandas安装与学习
- pandas学习笔记
- [pandas] 数据类型学习笔记
- pandas学习笔记
- pandas学习笔记
- pandas学习01
- pandas学习02
- pandas学习笔记
- Pandas学习笔记
- CCS中的GEL语言
- Android 事件分发机制源码攻略(二) —— ViewGroup篇
- vue项目中weChat的title问题
- -----hdu 5073-Galaxy
- BootStrap的modal模态框的使用
- Pandas学习
- metasploit学习1
- CCS中的文注释乱码问题
- hdu3374 String Problem (字符串最小表示)
- 【安全牛学习笔记】DNS信息收集-DIG
- Mysql中的count()与sum()区别
- vue router-view详细讲解一
- arm-poky-linux-gnueabi- (5.3.0) 工具链编译live555-20170718
- Js使用arguments动态获取传参个数