最后一次更新日期: 2019/3/21
pandas
是基于numpy
的数据分析库,提供一些更易用的数据模型和大量高效的统计方法。
使用前先导入模块:
import pandas as pd
按需导入以下模块:
import numpy as np
import matplotlib.pyplot as plt
1. 索引查找
(1). 索引器格式
单值选取:[value,...]
多值选取:[[value1,value2],...]
范围选取:[start:end:step,...]
start
表示区间的开始,默认值0,end
表示区间的结束(不包含),默认值等于轴长度,step
表示选取的步长,默认值1,采用默认值的参数可以省略,[:,...]
表示对应轴方向上全部选取。
pandas中索引器的格式与numpy差不多,但用法有区别。pandas除了numpy的位置索引,还增加了标签索引,虽然可以对Series
和DataFrame
直接使用索引器,但用法被严格限制,建议改用iloc
和loc
方法进行索引。
(2). 直接索引
In [157]: df=pd.DataFrame(np.arange(1,10).reshape((3,3)),columns=['col1','col2','col3'],index=['row1','row2','row3'])
In [158]: df[0:3:2]
Out[158]:
col1 col2 col3
row1 1 2 3
row3 7 8 9
In [161]: df['row1':'row3':2]
Out[161]:
col1 col2 col3
row1 1 2 3
row3 7 8 9
In [162]: df['col2']
Out[162]:
row1 2
row2 5
row3 8
Name: col2, dtype: int32
In [163]: df[['col1','col3']]
Out[163]:
col1 col3
row1 1 3
row2 4 6
row3 7 9
In [168]: df['col2'][1:3]
Out[168]:
row2 5
row3 8
Name: col2, dtype: int32
直接索引提供了有限的几种使用方式:按行位置进行索引切片、按行标签进行索引切片、按列标签取列、按列标签列表取多列、布尔索引筛选行、索尔索引筛选元素等。
一次索引器只能使用一种方式,不能行列同时操作,如有需要,可进行连续索引。
(3). loc和iloc索引
In [169]: df.loc['row1','col1']
Out[169]: 1
In [170]: df.loc['row1':'row3':2,'col1':'col3':2]
Out[170]:
col1 col3
row1 1 3
row3 7 9
In [185]: df.iloc[0,0]
Out[185]: 1
In [186]: df.iloc[0:3:2,0:3:2]
Out[186]:
col1 col3
row1 1 3
row3 7 9
loc
专用于标签索引,iloc
专用于位置索引,索引器可接收单值、列表、范围、布尔索引,可同时索引行和列。
(4). 布尔索引
In [190]: df>5
Out[190]:
col1 col2 col3
row1 False False False
row2 False False True
row3 True True True
In [191]: df[df>5]
Out[191]:
col1 col2 col3
row1 NaN NaN NaN
row2 NaN NaN 6.0
row3 7.0 8.0 9.0
In [192]: df['col1']>2
Out[192]:
row1 False
row2 True
row3 True
Name: col1, dtype: bool
In [193]: df.loc[df['col1']>2]
Out[193]:
col1 col2 col3
row2 4 5 6
row3 7 8 9
In [196]: df.loc[df['col1']>2,df.iloc[1]>5]
Out[196]:
col3
row2 6
row3 9
In [208]: df.iloc[df['col1'].values>2]
Out[208]:
col1 col2 col3
row2 4 5 6
row3 7 8 9
布尔索引是一种比较特殊的索引,通过对pandas或numpy的数据模型进行逻辑运算得到,与源数据结构相同,数据类型为bool
,用于标识每个元素是否符合逻辑运算的条件。在索引器中使用布尔索引可以筛选出符合条件的数据。
在直接索引时,二维布尔索引可以用于筛选DataFrame
的元素,形状不变,不符合条件的元素会被替换为NaN
,这一点和numpy不一样,numpy进行同样形式的筛选时会将符合条件的元素构造为新的一维数组返回;一维布尔索引只可以用于筛选行数据;
在使用loc
索引时,不能使用二维布尔索引,只能针对每个轴使用一维布尔索引,并且必须是由Series
运算得到的带有标签索引的布尔索引;
在使用iloc
索引时,同样不能使用二维布尔索引,只能针对每个轴使用一维布尔索引,并且必须是由一维ndarray
运算得到的不含标签索引的布尔索引(Series.values
可得到对应的ndarray
)。
(5). 指定值查找
In [141]: df=pd.DataFrame({'a':[np.nan,1,2],'b':[3,np.nan,4]})
In [142]: df
Out[142]:
a b
0 NaN 3.0
1 1.0 NaN
2 2.0 4.0
In [143]: df.isin([2,3])
Out[143]:
a b
0 False True
1 False False
2 True False
In [144]: df.isna()
Out[144]:
a b
0 True False
1 False True
2 False False
isin
方法用于查找存在于指定列表中的值,isna
方法用于查找NaN值,两方法都会返回布尔索引,通常结合索引器使用。
2. 表连接
pandas提供了类似于sql的join
、merge
、concat
方法进行表连接。
(1). 索引连接
In [227]: df1=pd.DataFrame([[1,2],[3,4]],columns=['col1','col2'],index=[1,0])
In [228]: df2=pd.DataFrame([[5,6],[7,8]],columns=['col3','col4'],index=[0,1])
In [229]: df1.join(df2,how='inner')
Out[229]:
col1 col2 col3 col4
1 1 2 7 8
0 3 4 5 6
join
方法根据索引进行表连接,how
参数指定连接方式,有inner
内连接、outer
外连接、left
左连接、right
右连接 这几种,默认为left
。
此处的join
和sql中的join并不一样。
(2). 键连接
In [233]: df1=pd.DataFrame({'col1':[1,2,3],'col2':[4,5,6]})
In [234]: df2=pd.DataFrame({'col2':[4,5,7],'col3':[1,2,2]})
In [235]: df1.merge(df2)
Out[235]:
col1 col2 col3
0 1 4 1
1 2 5 2
In [237]: df1.merge(df2,how='left',left_on='col1',right_on='col3')
Out[237]:
col1 col2_x col2_y col3
0 1 4 4.0 1.0
1 2 5 5.0 2.0
2 2 5 7.0 2.0
3 3 6 NaN NaN
merge
方法根据指定键(列)进行表连接,通过on
参数(相同键)或left_on
和right_on
参数(不同键)指定,默认会将两表中都存在的键作为连接键;how
参数指定连接方式,有inner
内连接、outer
外连接、left
左连接、right
右连接 这几种,默认为inner
。
该方法才是sql中join的等效方法。
(3). 拼接
In [239]: df1=pd.DataFrame({'col1':[1,2,3],'col2':[4,5,6]})
In [240]: df2=pd.DataFrame({'col2':[4,5,7],'col3':[1,2,2]})
In [241]: pd.concat([df1,df2])
Out[241]:
col1 col2 col3
0 1.0 4 NaN
1 2.0 5 NaN
2 3.0 6 NaN
0 NaN 4 1.0
1 NaN 5 2.0
2 NaN 7 2.0
In [242]: pd.concat([df1,df2],join='inner')
Out[242]:
col2
0 4
1 5
2 6
0 4
1 5
2 7
In [243]: pd.concat([df1,df2],axis=1)
Out[243]:
col1 col2 col2 col3
0 1 4 4 1
1 2 5 5 2
2 3 6 7 2
用于拼接表,等效于sql中的union all。
axis
参数指定用于拼接的轴,默认0;join
参数指定其他轴的处理方式,inner
表示只返回都存在的项,outer
表示全部返回,默认outer
。
拼接后的结果表中可能会有行索引或列索引上的重复,可以视需要重整索引。
网友评论