【数据处理】【数据清洗】【7.2 数据转换】 2021-07-03

7.2 数据转换

数据转换包括:处理重复值、使用函数/映射转换数据、替代值、重命名轴索引、离散化&分箱、异常值检测、置换&随机抽样、虚拟变量

7.2.1 删除重复值

  1. 首先pandas对象可使用 duplicated( ) 方法查看数据是否存在重复(沿着行轴的轴向检查是否有相同的行)。其结果返回的是一个布尔值Series,True 表示此行与之前的某一行重复。另外由于方法中没有 axis 参数,此方法无法检查是否有重复的列。


    image.png
  2. 对于DataFrame对象,默认用一行中的所有观测值(即行中所有列的元素)来判断是否与其他行存在重复。也就是以一整行为单位进行重复值的检查。 如果想指定特定的列来检测是否有重复,需要以列表的形式将列名作为参数传入。


    image.png
  3. 若要删除重复的行,使用 drop_duplicates( ) 方法,其参数的用法与 duplicated( ) 相同。另外,两个方法都是默认保留第一个观测到的值。转入参数 keep='last' 将会返回最后一个。

dataFrame.drop_duplicates(['c1','c2'],  keep='last')

7.2.2 使用函数/映射转换数据

若想对DataFrame中某列的数据进行转换,可使用Series的 map( ) 方法。大体思路为,引用要转换的列(此时单独被引用的列是Series对象)⇒ 应用 map( ) 方法 ⇒ 将方法返回的结果赋值给DataFrame的原列、或新创建的列,从而完成转换。

map( ) 是对Series中的每个元素分别执行操作的方法。可接收一个函数(通常为lambda函数)、或一个包含了映射关系的字典型对象作为参数(即,具体的转换操作)。

  1. 使用字典型对象时,按照 字典键⇔字典值 的映射关系转换数据。即,字典键为元数据,字典值为目标数据。
dataFrame['a'].map({1:'1a', 2:'2b'})
  1. 使用函数时, 对每个Series元素都会执行一遍函数操作。其中,lambda函数中的变量x代表Seires里的各元素。
dataFrame['a'].map(lambda x: 'done' if x =='完成' else 'not yet')

7.2.3 替代值

相比Series的 map( ) 方法一次只能对一列执行操作,repalce( ) 方法可同时对多列执行替代操作(Series和DataFrame对象都有此方法)。

  1. 替代一个值时,作为参数的原值、和替代值由逗号隔开。
dataFrame.replace('originValue', 'substitue')
  1. 替代多个值时,传入一个字典、或两个列表。此时,逗号左侧列表内均为原值,逗号右侧列表内均为替代值,二者按照其在各列表内的位置一一对应。如果替代值仅有一个(不会因原值而不同),则逗号右侧无需使用列表形式。
dataFrame.replace({'originValue1':'substitue1', 'originValue2':'substitue2'})
dataFrame.replace(['originValue1', 'originValue2'], ['substitue1', 'substitue2'])
dataFrame.replace(['originValue1', 'originValue2'], 'uniqueSubstitue')
  1. replace( ) 方法会返回一个新的对象。如果想更改对象则需传入 inplace=True 参数。

7.2.4 重命名轴索引

有时候仅需要修改现有轴索引上的标签,而不是添加、或删除行/列。此时可以使用索引对象的 map( ) 方法、或 rename( ) 方法。

  1. map( ) 的用法和Series中的类似:对索引对象应用 map( ) 方法 ⇒ 将方法返回的结果赋值给索引对象,从而完成转换。
data.index = data.index.map(lambda x: x[:4].upper())
  1. rename( ) 方法可以同时处理行轴、和列轴上的索引标签,十分方便。通常是通过传入字典对象的方式替换索引标签。也可使用向量化字符串所带的方法,对索引标签进行修改。此时参数值中的str即代表索引中的向量化字符串。
    另外,rename( ) 方法的目的虽然是修改索引标签,但其返回的是一个新的数据集对象(索引+数据),若想修改原有数据集,则需要传入参数 inplace=True 。
data.rename(index={'originLabel', 'substitute'}, columns={'originLabel', 'substitute'})
data.rename(index=str.title, columns=str.upper)

索引对象还有一个 reindex( ) 用来修改索引。rename( ) 与其最大的区别在于,rename( ) 不会改变索引的结构(添加/减少索引的元素,或更改索引上各元素的排列顺序),仅仅是修改索引标签。

7.2.5 离散化&分箱

你可能感兴趣的:(【数据处理】【数据清洗】【7.2 数据转换】 2021-07-03)