本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Data_Analysis/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接: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
duplicated和drop_duplicates方法都是默认保留第一个观测到的值,可以通过传入参数keep=”last”来保留最后一个。
1>>> df.drop_duplicates(["a"],keep="last")
2 a b
34 one 5
46 two 6
2.使用函数或映射转换数据:
对于许多数据集,你可能希望根据数组array、Series或 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
9dtype: float64
要对每个值使用不同的替换,需要传递替换列表。
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
9dtype: float64
传递的参数也可以是字典。
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
与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 并将新值分配给其索引和列属性的繁琐工作中解放出来。
本篇文章来源于微信公众号: 码农设计师