美文网首页
[python][科学计算][pandas]简要使用教程4-查询

[python][科学计算][pandas]简要使用教程4-查询

作者: jiedawang | 来源:发表于2019-03-18 13:19 被阅读0次

    最后一次更新日期: 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的位置索引,还增加了标签索引,虽然可以对SeriesDataFrame直接使用索引器,但用法被严格限制,建议改用ilocloc方法进行索引。

    (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的joinmergeconcat方法进行表连接。

    (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_onright_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

    拼接后的结果表中可能会有行索引或列索引上的重复,可以视需要重整索引。

    相关文章

      网友评论

          本文标题:[python][科学计算][pandas]简要使用教程4-查询

          本文链接:https://www.haomeiwen.com/subject/sryvmqtx.html