首页Python【Python数据分析】3...

【Python数据分析】32.数据清洗与准备——数据转换1


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis

根据《Python for Data Analysis 3rd Edition》翻译整理

—————————————————–

1.删除重复值:

出于多种原因,可能会在 DataFrame 中找到重复的行。

 1>>> df = pd.DataFrame({"a":["one","two","one","two","one","two","two"],"b":[1,2,3,4,5,6,6]})
2>>> df
3     a  b
40  one  1
51  two  2
62  one  3
73  two  4
84  one  5
95  two  6
106  two  6

 duplicated 方法返回的是一个布尔型数据,反映的是每一行是否与之前出现的行有重复的情况(其列值与前一行中的值完全相等)。

1>>> df.duplicated()
20    False
31    False
42    False
53    False
64    False
75    False
86     True
9dtype: bool

drop_duplicates方法返回的是DataFrame数据类型,内容为 duplicated 方法返回数组中为False的部分。

1>>> df.drop_duplicates()
2     a  b
30  one  1
41  two  2
52  one  3
63  two  4
74  one  5
85  two  6

默认情况下,上述两种方法都考虑所有列。你可以通过subset参数指定数据的任何子集来检测重复项。

1>>> df.drop_duplicates(subset=["a"])
2     a  b
30  one  1
41  two  2

duplicateddrop_duplicates方法都是默认保留第一个观测到的值,可以通过传入参数keep=”last”来保留最后一个。

1>>> df.drop_duplicates(["a"],keep="last")
2     a  b
34  one  5
46  two  6

2.使用函数或映射转换数据:

对于许多数据集,你可能希望根据数组arraySeries或 DataFrame 中的列中的值执行一些转换操作。

使用 map 方法可以很方便地来完成按元素转换和其他数据清理有关的操作。

考虑以下关于不同学生姓名和身高的假设数据:

1>>> df = pd.DataFrame({'Name':['Tom','jerry','Alexander','Jack','Aiden','Ryan'],'Height':[120,110,125,122,119,118]})
2>>> df
3    Name  Height
40    Tom     120
51  jerry     110
62   Alex     125
73   Jack     122
84  Aiden     119
95   Ryan     118

假设,你想添加一列用于表明不同学生的年级信息。

首先需要定义一个姓名和年级的映射关系,然后通过Series对象的 map 方法完成操作,该方法接收一个函数或一个包含映射关系的字典型对象。

 1>>> Name_to_Grade = {'tom':3,'jerry':1,'alex':2,'jack':1,'aiden':3,'ryan':2}
2>>> df['Grade'] = df['Name'].map(lambda x:Name_to_Grade[x.lower()])
3>>> df
4    Name  Height  Grade
50    Tom     120      3
61  jerry     110      1
72   Alex     125      2
83   Jack     122      1
94  Aiden     119      3
105   Ryan     118      2

我们也可以通过传递一个函数来完成操作。

假设,此次需要根据身高来表明不同水平。

 1>>def get_level(x):
2...     if x >=120:
3...         return 1
4...     else:
5...         return 2
6
7>>> df['Level'] = df['Height'].map(get_level)
8>>> df
9    Name  Height  Grade  Level
100    Tom     120      3      1
111  jerry     110      1      2
122   Alex     125      2      1
133   Jack     122      1      1
144  Aiden     119      3      2
155   Ryan     118      2      2

3.替代值:

使用 fillna 填充缺失值是通用值替换的特色案例, map 可以用来修改一个对象中的子集的值,但是 replace 提供了更为简单灵活的实现。

假设,下面Series对象中的 -999 值是缺失数据的标记值,需要使用 NA 值替换它们。

可以通过  replace 方法实现,返回一个新对象。

 1>>> data = pd.Series([25,-999,36,56,-999,58,1000])
2>>> data
30      25
41    -999
52      36
63      56
74    -999
85      58
96    1000
10dtype: int64
11
12>>> data.replace(-999 , np.nan)
130      25.0
141       NaN
152      36.0
163      56.0
174       NaN
185      58.0
196    1000.0
20dtype: float64

如果想一次替换多个值,可以传递一个列表,然后传递替换值。

1>>> data.replace([-999,1000] , np.nan)
20    25.0
31     NaN
42    36.0
53    56.0
64     NaN
75    58.0
86     NaN
9dtypefloat64

要对每个值使用不同的替换,需要传递替换列表。

1>>> data.replace([-999,1000] , [np.nan,0])
20    25.0
31     NaN
42    36.0
53    56.0
64     NaN
75    58.0
86     0.0
9dtypefloat64

传递的参数也可以是字典。

1>>> data.replace({-999:0 , 1000:np.nan})
20    25.0
31     0.0
42    36.0
53    56.0
64     0.0
75    58.0
86     NaN
9dtype: float64
4.重命名轴索引:

Series中的值一样,轴标签可以通过函数或某种形式的映射进行转换,生成新的、不同标签的对象。也可以在不创建新数据结构的情况下就地修改轴。

和Series对象一样,轴索引也有一个 map 方法。

通过赋值给原来数据的index,进行轴索引的重命名操作。

 1>>> df = pd.DataFrame({'Name':['Tom','jerry','Alex','Jack'],'Height':[120,110,125,122]},index=["one","two","three","four"])
2>>> df
3        Name  Height
4one      Tom     120
5two    jerry     110
6three   Alex     125
7four    Jack     122
8
9# 将索引值的首字母变为大写
10>>> df.index = df.index.map(lambda x:x.title())
11>>> df
12        Name  Height
13One      Tom     120
14Two    jerry     110
15Three   Alex     125
16Four    Jack     122

如果您想在不修改原始数据集的情况下创建数据集的转换版本,可以使用rename 方法。

rename 方法可以结合字典对象使用,为轴提供新值。

 1# 将行和列的索引变为全部大写
2>>> df.rename(index=str.upper , columns=str.upper)
3        NAME  HEIGHT
4ONE      Tom     120
5TWO    jerry     110
6THREE   Alex     125
7FOUR    Jack     122
8
9# 结合字典对象使用,为轴提供新值
10>>> df.rename(index={"Three":"三"} , columns={"Name":"姓名"})
11         姓名  Height
12One     Tom     120
13Two   jerry     110
14三      Alex     125
15Four   Jack     122

重命名操作可以让你从手动复制 DataFrame 并将新值分配给其索引和列属性的繁琐工作中解放出来。


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments