zoukankan      html  css  js  c++  java
  • 4-Pandas数据预处理之数据转换(文本数据规整)

    说明:本片博文接上篇博文【Pandas数据预处理之数据转换(哑变量编码pd.get_dummies())】以及上上篇博文【 Pandas数据预处理之数据转换(df.map()、df.replace())

      Pandas对于字符串和文本处理通常是由一些内置的字符串方法指定,一般语法格式为:series.str.method。其中,str.method被称为矢量化的字符串方法,包括str.upper()、str.lower()、str.split()一系列字符串的内置方法,还可以结合正则化式进行处理。

    (1)矢量化的字符串方法将对Series或者Index中的每个元素都进行相同的处理;

    说明:缺失值不做任何处理

    >>> s = pd.Series(['ADJruK','hjuQ',np.nan,'hj'])
    >>> s
    0    ADJruK
    1      hjuQ
    2       NaN
    3        hj
    dtype: object
    >>> s.str.upper()
    0    ADJRUK
    1      HJUQ
    2       NaN
    3        HJ
    dtype: object
    

    (2)对于Index对象也可以使用矢量化字符串的处理方式;

    >>> df = pd.DataFrame(np.random.randint(10,size=(2,3)),columns=['Jack Joe','BOB Marly','sid Jane'])
    >>> df
       Jack Joe  BOB Marly  sid Jane
    0         4          1         4
    1         9          1         8
    
    #将所有列名转化为小写
    >>> df.columns = df.columns.str.lower()
    >>> df
    jack joe bob marly sid jane
    0 4 1 4
    1 9 1 8

    (3)链式法则(chain rules):将多个数据规整写在一行代码中;

    #将所有列名转化为小写,再使用下划线代替空格
    >>> df.columns = df.columns.str.lower().str.replace(' ','_')
    >>> df
       jack_joe  bob_marly  sid_jane
    0         4          1         4
    1         9          1         8
    

    (4)分割元素str.split()可以将一个Series对象规整为包含多个Series对象或DataFrame对象;

    例:需求为提取每个元素的姓名---使用str.get方法世界在str上进行索引

    #创建一个Series对象
    >>> ss = pd.Series(['name1 sex1 age1','name2 sex2 age2','name3 sex3 age3'])
    >>> ss
    0    name1 sex1 age1
    1    name2 sex2 age2
    2    name3 sex3 age3
    dtype: object
    
    >>> new_ss = ss.str.split(" ")
    >>> new_ss
    0    [name1, sex1, age1]
    1    [name2, sex2, age2]
    2    [name3, sex3, age3]
    >>> type(new_ss)
    <class 'pandas.core.series.Series'>
    >>> new_ss.shape
    (3,)
    >>> new_ss[0]
    ['name1', 'sex1', 'age1']
    
    
    #方法一:直接在str属性上使用索引(即str[]),即可提取每个样本的姓名
    >>> new_ss.str[0]
    0    name1
    1    name2
    2    name3
    dtype: object
    
    #方法二:使用str.get方法(即str.get()),即可提取每个样本的姓名
    >>> new_ss.str.get(0)
    0    name1
    1    name2
    2    name3
    dtype: object
    

      若需要将分隔开的元素规整成一个DataFrame,可以使用expand参数将分隔开的各个部分展开

    >>> ss.str.split(" ",expand = True)
           0     1     2
    0  name1  sex1  age1
    1  name2  sex2  age2
    2  name3  sex3  age3
    

     (5)结合正则表达式

     Series.str属性结合正则表达式可以匹配一定模式的字符的换的提取、判断、替换等操作。

    这些矢量化的字符串包括str.contains(查看是否包含指定的信息)、str.findall(提取指定的信息)、str.match、str.relpace(替换)和str.extract(指定捕获组以提取某信息)等等

      以爬取的“58同城网重庆市南岸区二手房数据中的楼层数(floors)”为例。

    >>> data = pd.read_csv('./input/data.csv',encoding = 'utf8')
    >>> data = data['floors']
    >>> data.head()
    0    中层(共16层)
    1    中层(共31层)
    2    中层(共33层)
    3    中层(共33层)
    4    高层(共28层)
    Name: floors, dtype: object
    

       使用str.contains()找到其中包含数字的元素 

    >>> data.str.contains(r'd')[:5]
    0    True
    1    True
    2    True
    3    True
    4    True

      使用str.repalce()对楼层进行加密(即将数字替换成'XX')

    >>> data.str.replace(r'd.','XX')[:5]
    0    中层(共XX层)
    1    中层(共XX层)
    2    中层(共XX层)
    3    中层(共XX层)
    4    高层(共XX层)
    Name: floors, dtype: object
    

      使用str.findall()提取其中的数字

    >>> data.str.findall(r'd.').str.get(0)[:5]
    0    16
    1    31
    2    33
    3    33
    4    28
    Name: floors, dtype: object
    

      使用str.extract()指定捕获组以直接提取数字

    >>> data.str.extract(r'(d.)',expand=False)[:5]
    0    16
    1    31
    2    33
    3    33
    4    28
    Name: floors, dtype: object
    

      (6)对多个标签样本进行哑变量编码

    使用str属性进行哑变量编码,并使用sep指定分隔符

    >>> s = pd.Series(["Animation,Children's,Comedy","Comedy,Romance","Animation","Comedy"])
    >>> s
    0    Animation,Children's,Comedy
    1                 Comedy,Romance
    2                      Animation
    3                         Comedy
    
    #对多个标签进行哑变量编码
    >>> s.str.get_dummies(sep=',')
       Animation  Children's  Comedy  Romance
    0          1           1       1        0
    1          0           0       1        1
    2          1           0       0        0
    3          0           0       1        0
    

      

  • 相关阅读:
    拉普拉斯------拉普拉斯算子
    拉普拉斯------拉普拉斯变换
    傅里叶------傅里叶变换
    傅里叶------傅里叶级数
    深度学习笔记------卷积训练
    深度学习笔记------卷积神经网络
    计算机图形学笔记------直线的扫描转换
    深度学习笔记------神经网络
    深度学习笔记------softmax回归
    深度学习笔记------线性回归
  • 原文地址:https://www.cnblogs.com/Cheryol/p/13416577.html
Copyright © 2011-2022 走看看