Pandas包

作者: 风一样的我1 | 来源:发表于2021-04-17 18:42 被阅读0次
    Pandas.png

    一、两个基本数据结构

    Series和DataFrame。其中Series的一维的,DateFrame是多维的。

    二、与Numpy的不同

    1. Numpy数组中的数据类型是同质的;df中数据类型可以是不同的。
    2. df有索引的对象。index在pd中是一种数据类型。

    三、基本属性

    index:表示索引
    columns:表示列名,其实也是一种索引对象。一般函数默认是按行索引,除非传入index=columns或者axis=1的参数

    四、索引对象

    • 在Series中,只有index索引。
    • 在DF中,有index和columns两种索引。
    • 索引是一种对象,可以在生成时显式地生成,也可以在生成后进行删除增加。但是数组的索引不可以更改。
    • 索引对象可以通过obj.index和obj.columns进行访问
    • 标签可以重复

    五、Series介绍

    介绍:单维数组型对象

    1.查看索引和值

    series_obj.index
    series_obj.values

    2.生成

    a. 传入序列:pd.Series(序列,index=序列),可以指定index
    b. 通过字典生成,这样index就是字典键,values是对应的键值

    六、DataFrame

    1.生成

    a. 字典,pd.DataFrame(字典,columns=【可以指定列的顺序】)
    b. 嵌套字典,即字典的键值还是字典,通过两个字典的键来确定索引
    c. 2维数组
    d. 多维列表

    2.修改和增加

    • 与字典的操作类似,通过df[索引]=数据来增加或者修改数据。
    • 通过索引某一列或者某一行,使之等于某个标量或者向量来更改值。如果将Series类型的值赋值给了某一列,则会按照相同的索引来赋值。空缺的地方会使用缺失值补全。

    3.删除

    与字典的操作类似,del df[索引]
    注意:从df种选取的列是视图,做修改也会改变原数据。

    七、索引相关操作

    1.重建索引

    • df.reindex(新的索引序列),通过该方法改变数据的排列,如果数据中没有该索引会返回NA。
    • 如果没有显式地说明index=,columns=,则该函数默认改变行索引
    • 该方法可以用df.loc标签索引的方法进行替代,即df.loc[[新的行索引],新的列索引]
    • 可以使用method参数和fill_value参数来进行缺失值的替换

    2.删除索引

    • del df[index]删除一列
    • df.drop([索引])返回删除索引后的df

    八、索引数据

    1.标签索引

    • df['a']
    • df[['a','b']]
    • df[['a':'b']] 注意使用标签时,两边都是闭区间。

    2.切片和整数

    df[2:4]选择行元素
    df[列表]选择列元素

    3.布尔值索引

    df[series > 2]

    4.loc和iloc函数

    同时选择行标签和列标签的数据

    • df.loc[行轴标签,列轴标签] 表示使用标签进行索引。其中行标签和列标签可以是值,列表,切片
    • df.iloc[行整数索引,列整数索引],使用方法同上
      注意:使用轴标签时是双闭区间。
    • 如果iloc和loc只有一个参数传进去,默认是行索引

    九、算术运算

    1.对齐运算

    • 两个df之间运算,按照索引对齐,对不齐的补NA值。
    • 对不齐的也可以使用填充值参数

    2.广播运算

    df和series之间的运算

    • 默认情况下,df和series间的数学操作会将series的index和df的列匹配,广播到各行。(即各行都进行这个运算,而不单单是一行)
    • 也可以使用行匹配,列广播。可以使用算术方法如add\sub,传入参数axis='index'

    十、统计方法

    • df.sum() / mean() / cumsum()默认对行进行运算
    • df.describe()函数对df或者series进行常见的统计变量的描述
    • 协方差,df.corr()/cov() 默认是列与列之间的,传入axis='columns'进行行之间的

    十一、排序

    • df.sort_values(by=[排序的索引], ascending=False),可以按照单索引值排序,也可以按多个索引排序
    • df.sort_index(),按照索引进行排序
    • df.rank()函数对某字段进行排序,并返回排序的数组。其中的method参数和sql中的对应关系为:
      method = 'first'按照值在表中出现的顺序排序,相当于sql中的row_number
      method = 'min',如果有两个相同的值,则取较小的排名,排名值不连续,相当于rank();
      method = 'dense',与min类似,但是区别在于排名值是连续的,相当于sql中的dense_rank();
    • pd.cut(bins=int, labels=[]),将序列按照预设值分组,并给每组分配一个等级或者标签。当bins的值为整数时,分成相同长度的数组。
    • pd.qcut(),与cut类似,但是按照分位数进行分割

    十二、特殊函数

    1.series.unique()返回Series中的唯一值,相当于sql中的distinct
    2.series.value_counts()返回每个值出现的次数。
    3.series.isin(序列)返回布尔值,表示series是否在序列中的布尔值。
    4.series.str,通过Series的str属性,我们可以对文本进行操作,如去除文本中的某些符号,或利用正则表达式进行匹配。字符串的方法同Python内建字符串方法。

    十三、分组聚合

    • 使用df.groupby(by=[index])分组,其中index可以是多个索引也可以是单个索引

    十四、多表关联

    1. 和数据库中的join用法类似。Pandas中有两种方法:
    • 类方法,pd.merge(df1,df2)
    • 实例方法,df1.merge(right=d2)
      参数描述如下:
      on:当两表中的合并键名相同时,可以用on
      left_on:当两表中的合并键名不同时,左表的键名
      right_on:与上述对应,右边的键名
      how:how='inner';'left';'right';'outer'分别对应sql中的内连接、左连接、右连接和外连接;
    df1=pd.DataFrame({'key':['a', 'b', 'c', 'd', 'a', 'b'], 'data1':range(6)})
    df2=pd.DataFrame({'key':['a','b','a','b','d'],'data2':range(5)})
    print(df1)
    print(df2)
    --result
      key  data1
    0   a      0
    1   b      1
    2   c      2
    3   d      3
    4   a      4
    5   b      5
      key  data2
    0   a      0
    1   b      1
    2   a      2
    3   b      3
    4   d      4
    --合并
    df1.merge(right=df2, on='key',how='inner')
    --合并结果
    key data1   data2
    0   a   0   0
    1   a   0   2
    2   a   4   0
    3   a   4   2
    4   b   1   1
    5   b   1   3
    6   b   5   1
    7   b   5   3
    8   d   3   4
    
    1. 按照索引进行合并
      和merge用法相似,但是按照index进行连接;
    2. concat连接法
      用法:pd.concat([df1, df2])
      像sql中的union用法,即将两个表连接到一块,可以上下连接,也可以左右连接。
    • 上下连接,默认上下连接。效果如图:
    df1=pd.DataFrame(
    {'A':list('abcde'),
    'B':list('ghjik')}
    )
    df2=pd.DataFrame(
    {'C':list('abcde'),
    'D':list('ghjik')}
    )
    print(df1)
    print(df2)
    --result
     A  B
    0  a  g
    1  b  h
    2  c  j
    3  d  i
    4  e  k
       C  D
    0  a  g
    1  b  h
    2  c  j
    3  d  i
    4  e  k
    pd.concat([df1,df2])
    --result
    A   B   C   D
    0   a   g   NaN NaN
    1   b   h   NaN NaN
    2   c   j   NaN NaN
    3   d   i   NaN NaN
    4   e   k   NaN NaN
    0   NaN NaN a   g
    1   NaN NaN b   h
    2   NaN NaN c   j
    3   NaN NaN d   i
    4   NaN NaN e   k
    -左右连接,相当于join,按照索引进行连接
    ```python
    pd.concat([df1,df2],axis=1)
    --result
    A   B   C   D
    0   a   g   a   g
    1   b   h   b   h
    2   c   j   c   j
    3   d   i   d   i
    4   e   k   e   k
    

    十五、去除空值和重复值

    1. fillna()使用指定的对象填充;
    2. dropna(),删除所有含有空值的行。若要删除列,则改变axis=1
    3. 查找重复值,df.duplicated() 返回一个布尔数组,如果该数据是在其它行也出现,则返回True。注,如果是查找df的重复,则两行数据完全相等才会返回True,因此一般判断某个字段。

    十六、apply函数的用法

    apply函数可以让我们自定义函数并运用于整个数组。
    eg. 首先通过city字段进行聚合,再找出每个分组内按照positionId排序前两个的数据。
    原表如图:


    image.png
    def fun(x):
        x.sort_values(by=['positionId'],ascending=True)
        return x[:2]
    position.groupby(by=['city']).apply(fun)
    

    进行聚类分组,结果如图


    image.png
    • 注意:pandas中还有一类函数,agg函数,其与apply函数用法类似,区别在于agg函数中只能使用聚合函数,即返回的值只有一行。
      如图,只返回了聚合后的一行值。


      image.png

    十七、数据透视表

    通过数据透视表,将数据按照多个维度进行聚类。

    • 语法:df.pivot_table(index, columus, values, aggfunc,margins)
      其中,index和columns分别表示行索引和列索引,values表示聚类的值,aggfunc表示自定义聚类函数,默认使用mean函数,margins表示是否进行求和,默认False,如果是True,则多出求和一栏
      如原数据:


      image.png

      通过数据透视表,查看每个城市不同学历的平均公司编号(?数据源不对,仅为了练习)

    position.pivot_table(index=['city','education'],columns='industryField',values='companyId')
    

    返回的结果:


    image.png

    如果让不同的列使用不同的聚类函数,可以使用aggfunc自定义函数
    ,使用列表为每个values字段传入不同的函数,注意传入的函数是自定义形式

    相关文章

      网友评论

          本文标题:Pandas包

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