7.2 数据转换
数据转换包括:处理重复值、使用函数/映射转换数据、替代值、重命名轴索引、离散化&分箱、异常值检测、置换&随机抽样、虚拟变量
7.2.1 删除重复值
-
首先pandas对象可使用 duplicated( ) 方法查看数据是否存在重复(沿着行轴的轴向检查是否有相同的行)。其结果返回的是一个布尔值Series,True 表示此行与之前的某一行重复。另外由于方法中没有 axis 参数,此方法无法检查是否有重复的列。
image.png -
对于DataFrame对象,默认用一行中的所有观测值(即行中所有列的元素)来判断是否与其他行存在重复。也就是以一整行为单位进行重复值的检查。 如果想指定特定的列来检测是否有重复,需要以列表的形式将列名作为参数传入。
image.png -
若要删除重复的行,使用 drop_duplicates( ) 方法,其参数的用法与 duplicated( ) 相同。另外,两个方法都是默认保留第一个观测到的值。转入参数 keep='last' 将会返回最后一个。
dataFrame.drop_duplicates(['c1','c2'], keep='last')
7.2.2 使用函数/映射转换数据
若想对DataFrame中某列的数据进行转换,可使用Series的 map( ) 方法。大体思路为,引用要转换的列(此时单独被引用的列是Series对象)⇒ 应用 map( ) 方法 ⇒ 将方法返回的结果赋值给DataFrame的原列、或新创建的列,从而完成转换。
map( ) 是对Series中的每个元素分别执行操作的方法。可接收一个函数(通常为lambda函数)、或一个包含了映射关系的字典型对象作为参数(即,具体的转换操作)。
- 使用字典型对象时,按照 字典键⇔字典值 的映射关系转换数据。即,字典键为元数据,字典值为目标数据。
dataFrame['a'].map({1:'1a', 2:'2b'})
- 使用函数时, 对每个Series元素都会执行一遍函数操作。其中,lambda函数中的变量x代表Seires里的各元素。
dataFrame['a'].map(lambda x: 'done' if x =='完成' else 'not yet')
7.2.3 替代值
相比Series的 map( ) 方法一次只能对一列执行操作,repalce( ) 方法可同时对多列执行替代操作(Series和DataFrame对象都有此方法)。
- 替代一个值时,作为参数的原值、和替代值由逗号隔开。
dataFrame.replace('originValue', 'substitue')
- 替代多个值时,传入一个字典、或两个列表。此时,逗号左侧列表内均为原值,逗号右侧列表内均为替代值,二者按照其在各列表内的位置一一对应。如果替代值仅有一个(不会因原值而不同),则逗号右侧无需使用列表形式。
dataFrame.replace({'originValue1':'substitue1', 'originValue2':'substitue2'})
dataFrame.replace(['originValue1', 'originValue2'], ['substitue1', 'substitue2'])
dataFrame.replace(['originValue1', 'originValue2'], 'uniqueSubstitue')
- replace( ) 方法会返回一个新的对象。如果想更改对象则需传入 inplace=True 参数。
7.2.4 重命名轴索引
有时候仅需要修改现有轴索引上的标签,而不是添加、或删除行/列。此时可以使用索引对象的 map( ) 方法、或 rename( ) 方法。
- map( ) 的用法和Series中的类似:对索引对象应用 map( ) 方法 ⇒ 将方法返回的结果赋值给索引对象,从而完成转换。
data.index = data.index.map(lambda x: x[:4].upper())
- rename( ) 方法可以同时处理行轴、和列轴上的索引标签,十分方便。通常是通过传入字典对象的方式替换索引标签。也可使用向量化字符串所带的方法,对索引标签进行修改。此时参数值中的str即代表索引中的向量化字符串。
另外,rename( ) 方法的目的虽然是修改索引标签,但其返回的是一个新的数据集对象(索引+数据),若想修改原有数据集,则需要传入参数 inplace=True 。
data.rename(index={'originLabel', 'substitute'}, columns={'originLabel', 'substitute'})
data.rename(index=str.title, columns=str.upper)
索引对象还有一个 reindex( ) 用来修改索引。rename( ) 与其最大的区别在于,rename( ) 不会改变索引的结构(添加/减少索引的元素,或更改索引上各元素的排列顺序),仅仅是修改索引标签。
网友评论