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
  • 相关阅读:
    vim复制
    嵌入式Linux学习(二)
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1025 数的划分
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
  • 原文地址:https://www.cnblogs.com/strivepy/p/11704595.html
Copyright © 2011-2022 走看看