zoukankan      html  css  js  c++  java
  • Pandas使用实用技巧

    Pandas实用使用技巧

    1 列拆分成行

    常见的需求是将某一列根据指定的分隔符拆分成多列。现有需求,根据指定的分隔符将其拆分为多行

    例:

    df =     A       B
          0  a       f
          1  b;c     h;g 
          2  d       k
          3  e       l

    现需要将其拆分为:

    df =     A       B
          0  a       f
          1  b       h
          1  c       g 
          2  d       k
          3  e       l

    1.1 处理A列 

    实现过程如下:

    df = pd.DataFrame({'A': ['a', 'b;c', 'd', 'e'], 'B': ['f', 'h;j', 'k', 'l']})
    df
         A    B
    0    a    f
    1    b;c    h;j
    2    d    k
    3    e    l

     将A列按照“;”分割,并展开为DataFrame,该效果由expand参数空值:

    df_a = df['A'].str.split(';', expand=True)
    df_a
    
        0    1
    0    a    None
    1    b    c
    2    d    None
    3    e    None

     将df_a进行堆积:

    df_a = df_a.stack()
    df_a
    
    0  0    a
    1  0    b
       1    c
    2  0    d
    3  0    e
    dtype: object

    将内层索引重置为列并删除掉:

    df_a = df_a.reset_index(level=1, drop=True)
    df_a
    
    0    a
    1    b
    1    c
    2    d
    3    e
    dtype: object

    重命名该Series,否则接下来合并会失败:

    df_a.rename('A_split', inplace=True)
    df_a
    
    0    a
    1    b
    1    c
    2    d
    3    e
    Name: A_split, dtype: object

    1.2 处理列B

    处理过程同列A,最后重命名后为:

    df_b.rename('B_split', inplace=True)
    df_b
    
    0    f
    1    h
    1    j
    2    k
    3    l
    Name: B_split, dtype: object

    1.3 合并A_split和B_split

    水平合并处理完成后的两列:

    concat_a_b = pd.concat([df_a, df_b], axis=1)
    concat_a_b
    A_split B_split 0 a     f
    1 b      h 1 c     j 2 d     k 3 e      l

    1.4 最后和原数据合并

    将最终处理的数据和原数据根据索引进行合并:

    df = df.join(concat_a_b, how='inner')
    df
    
       A      B      A_split    B_split
    0    a      f      a          f
    1    b;c     h;j    b          h
    1    b;c     h;j    c          j
    2    d       k      d          k
    3    e       l      e          l

    最后达到了想要的效果。

    2 切片插入多行

    常见的需求是在指定的位置插入一行或者一列。现有需求,在指定的位置插入多行或者多列:

    df = pd.DataFrame({'Name': ['Tom', 'Jack', 'Steve', 'Ricky'], 'Age': [28,34,29,42]})
    
    df
    Out[4]: 
        Name  Age
    0    Tom   28
    1   Jack   34
    2  Steve   29
    3  Ricky   42
    
    df1 = pd.DataFrame({'Name':['Anna', 'Susie'],'Age':[20,50]})
    
    df1
    Out[6]: 
        Name  Age
    0   Anna   20
    1  Susie   50

     df2 = pd.DataFrame({'Name':['Anna', 'Susie', 'Jhone'],'Age':[20, 50, 35]})

     df2
     Out[10]:

       Name  Age
    0   Anna   20
    1  Susie   50
    2 Jhone 35

     2.1 将df1作为整体插入索引2的位置

    通过numpy的insert方法实现数组重构,然后再将数组构造成需要的表格:

    np.insert(df.values, 2, df1.values, axis=0)
    Out[7]: 
    array([['Tom', 28],
           ['Jack', 34],
           ['Anna', 20],
           ['Susie', 50],
           ['Steve', 29],
           ['Ricky', 42]], dtype=object)

    可以观察到数据被插入到df索引2的位置。可以根据原来的列名直接构造DataFrame来实现需求:

    pd.DataFrame(np.insert(df.values, 2, df1.values, axis=0), columns=df.columns)
    Out[8]: 
        Name Age
    0    Tom  28
    1   Jack  34
    2   Anna  20
    3  Susie  50
    4  Steve  29
    5  Ricky  42

     2.2 将df2每一行分开插入到指定位置

    通过numpy的insert方法实现数组重构,然后再将数组构造成需要的表格:

    np.insert(df.values, (0, 1, 2), df2.values, axis=0)
    Out[12]: 
    array([['Anna', 20],
           ['Tom', 28],
           ['Susie', 50],
           ['Jack', 34],
           ['Jhone', 35],
           ['Steve', 29],
           ['Ricky', 42]], dtype=object)

    可以观察到数据被插入到df索引0、1、2的位置。可以根据原来的列名直接构造DataFrame来实现需求:

    pd.DataFrame(np.insert(df.values, (0, 1, 2), df2.values, axis=0), columns=df.columns)
    Out[13]: 
        Name Age
    0   Anna  20
    1    Tom  28
    2  Susie  50
    3   Jack  34
    4  Jhone  35
    5  Steve  29
    6  Ricky  42
  • 相关阅读:
    用Eclipse做J2Me开发的前期配置
    cglib和asm相关的文章
    bcp命令详解
    Oracle/PLSQL AFTER DELETE Trigger
    Mybatis(九)分页插件PageHelper使用
    Mybatis(八)逆向工程
    Mybatis(四)关联映射
    Mybatis(三)返回值四.注解配置
    Mybatis(二)参数(Parameters)传递
    Mybatis(一)实现单表的增删改查
  • 原文地址:https://www.cnblogs.com/strivepy/p/11704595.html
Copyright © 2011-2022 走看看