1.数据概览
第一步当然是把缺失的数据找出来, Pandas 找缺失数据可以使用 info()
这个方法(这里选用的数据源还是前面一篇文章所使用的 Excel ,小编这里简单的随机删除掉几个数据)
import pandas as pd # 相对路径 df = pd.read_excel("result_data.xlsx") print(df) # 输出结果 plantform read_num fans_num rank_num like_num create_date 0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10 1 juejin NaN 0 -2.0 1 2019-11-23 23:00:03 2 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02 3 cnblog 650.0 3 NaN 0 2019-11-22 23:00:15 4 juejin 272.0 3 -23.0 1 2019-11-22 23:00:02 .. ... ... ... ... ... ... 403 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02 404 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01 405 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05 406 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02 407 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02 [408 rows x 6 columns] print(df.info()) # 输出结果 <class 'pandas.core.frame.DataFrame'> RangeIndex: 408 entries, 0 to 407 Data columns (total 6 columns): plantform 408 non-null object read_num 406 non-null float64 fans_num 408 non-null int64 rank_num 407 non-null float64 like_num 408 non-null int64 create_date 408 non-null datetime64[ns] dtypes: datetime64[ns](1), float64(2), int64(2), object(1) memory usage: 19.2+ KB
我们还可以使用另一个更加直观的方式来获取缺失的数据 isnull()
,如果是缺失的值,会返回 True ,如果不是则会返回 False
import pandas as pd # 相对路径 df = pd.read_excel("result_data.xlsx") print(df.isnull()) # 输出结果 plantform read_num fans_num rank_num like_num create_date 0 False False False False False False 1 False True False False False False 2 False False False False False False 3 False False False True False False 4 False False False False False False .. ... ... ... ... ... ... 403 False False False False False False 404 False False False False False False 405 False False False False False False 406 False False False False False False 407 False False False False False False [408 rows x 6 columns]
利用isnull().sum()可以直接显示每个列缺失的总数
2.重命名列
为了重命名列,我们将使用DataFrame的rename()
方法,允许你以一个映射(这里是一个字典)重新标记一个轴。
让我们开始定义一个字典来将现在的列名称(键)映射到更多的可用列名称(字典的值)。
>>> new_names = {'Unnamed: 0': 'Country', ... '? Summer': 'Summer Olympics', ... '01 !': 'Gold', ... '02 !': 'Silver', ... '03 !': 'Bronze', ... '? Winter': 'Winter Olympics', ... '01 !.1': 'Gold.1', ... '02 !.1': 'Silver.1', ... '03 !.1': 'Bronze.1', ... '? Games': '# Games', ... '01 !.2': 'Gold.2', ... '02 !.2': 'Silver.2', ... '03 !.2': 'Bronze.2'}
我们在对象上调用rename()
函数:
>>> olympics_df.rename(columns=new_names, inplace=True)
设置inplace
为True
可以让我们的改变直接反映在对象上。让我们看看是否正确:
>>> olympics_df.head() Country Summer Olympics Gold Silver Bronze Total 0 Afghanistan (AFG) 13 0 0 2 2 1 Algeria (ALG) 12 5 2 8 15 2 Argentina (ARG) 23 18 24 28 70 3 Armenia (ARM) 5 1 2 9 12 4 Australasia (ANZ) [ANZ] 2 3 4 5 12 Winter Olympics Gold.1 Silver.1 Bronze.1 Total.1 # Games Gold.2 0 0 0 0 0 0 13 0 1 3 0 0 0 0 15 5 2 18 0 0 0 0 41 18 3 6 0 0 0 0 11 1 4 0 0 0 0 0 2 3 Silver.2 Bronze.2 Combined total 0 0 2 2 1 2 8 15 2 24 28 70 3 2 9 12 4 4 5 12
3.缺失数据处理
3.1 删除
我们找到了缺失的数据,接下来就是对这部分数据进行删除操作了, Pandas 同样为我们提供了一个现成的方法 dropna()
。
dropna()
这个方法会默认删除缺失数据的行,就是这一行只要有缺失数据,整行都会删除:
import pandas as pd # 相对路径 df = pd.read_excel("result_data.xlsx") print(df.dropna()) # 输出结果 plantform read_num fans_num rank_num like_num create_date 0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10 2 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02 4 juejin 272.0 3 -23.0 1 2019-11-22 23:00:02 5 csdn 2202.0 129 0.0 37 2019-11-22 23:00:01 7 csdn 1621.0 76 0.0 27 2019-11-21 23:00:02 .. ... ... ... ... ... ... 403 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02 404 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01 405 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05 406 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02 407 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02 [405 rows x 6 columns]
在删除缺失行的时候还会有一种情况,就是整行数据全都缺失,我们还可以只删除整行数据全缺失,如果只是有缺失值的数据保留,这时我们可以用到 dropna()
的一个参数 how="any"
:
import pandas as pd # 相对路径 df = pd.read_excel("result_data.xlsx") print(df.dropna(how="any")) # 输出结果 plantform read_num fans_num rank_num like_num create_date 0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10 1 juejin NaN 0 -2.0 1 2019-11-23 23:00:03 2 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02 3 cnblog 650.0 3 NaN 0 2019-11-22 23:00:15 4 juejin 272.0 3 -23.0 1 2019-11-22 23:00:02 .. ... ... ... ... ... ... 403 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02 404 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01 405 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05 406 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02 407 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02 [408 rows x 6 columns]
因为小编的数据没有整行缺失的,可以看到这里又打印了所有的数据。
3.2 缺失数据填充
fillna()
import pandas as pd # 相对路径 df = pd.read_excel("result_data.xlsx") print(df.fillna(0)) # 输出结果 plantform read_num fans_num rank_num like_num create_date 0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10 1 juejin 0.0 0 -2.0 1 2019-11-23 23:00:03 2 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02 3 cnblog 650.0 3 0.0 0 2019-11-22 23:00:15 4 juejin 272.0 3 -23.0 1 2019-11-22 23:00:02 .. ... ... ... ... ... ... 403 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02 404 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01 405 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05 406 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02 407 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02 [408 rows x 6 columns]
上面的示例是将所有的缺失数据全都填充成了 0 ,但是如果我们只想填充其中的一列数据呢?
import pandas as pd # 相对路径 df = pd.read_excel("result_data.xlsx") print(df.fillna({'read_num': 10})) # 输出结果 plantform read_num fans_num rank_num like_num create_date 0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10 1 juejin 10.0 0 -2.0 1 2019-11-23 23:00:03 2 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02 3 cnblog 650.0 3 NaN 0 2019-11-22 23:00:15 4 juejin 272.0 3 -23.0 1 2019-11-22 23:00:02 .. ... ... ... ... ... ... 403 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02 404 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01 405 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05 406 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02 407 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02 [408 rows x 6 columns]
为了便于区分,小编这里只补充了 read_num
这一列,将默认填充数值补充成了 10 。
4 重复数据处理
如果要识别和删除DataFrame中的重复行,有两种方法可以提供帮助:duplicated
和drop_duplicates
。每个都将用于标识重复行的列作为参数。
duplicated
返回一个布尔向量,其长度为行数,表示行是否重复。drop_duplicates
删除重复的行。
默认情况下,重复集的第一个观察行被认为是唯一的,但每个方法都有一个keep
参数来指定要保留的目标。
keep='first'
(默认值):标记/删除重复项,第一次出现除外。keep='last'
:标记/删除重复项,除了最后一次出现。keep=False
:标记/删除所有重复项。
5 数据类型转化
看下当前数据表中的数据类型,这里使用的 dtypes
,示例如下:
import pandas as pd # 相对路径 df = pd.read_excel("result_data.xlsx") print(df) # 输出结果 plantform read_num fans_num rank_num like_num create_date 0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10 1 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10 2 juejin NaN 0 -2.0 1 2019-11-23 23:00:03 3 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02 4 cnblog 650.0 3 NaN 0 2019-11-22 23:00:15 .. ... ... ... ... ... ... 404 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02 405 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01 406 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05 407 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02 408 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02 print(df.dtypes) # 输出结果 plantform object read_num float64 fans_num int64 rank_num float64 like_num int64 create_date datetime64[ns] dtype: object
当然,我们如果想单独知道某一列的数据类型,也可以这么用:
import pandas as pd # 相对路径 df = pd.read_excel("result_data.xlsx") print(df['read_num'].dtypes) # 输出结果 float64
当我们需要转换数据类型的时候,可以使用 astype()
这个方法,在使用的时候讲需要转化的目标类型写在 astype()
后面括号里即可
import pandas as pd # 相对路径 df = pd.read_excel("result_data.xlsx") print(df['fans_num'].astype('float64')) # 输出结果 0 0.0 1 0.0 2 0.0 3 69.0 4 3.0 ... 404 0.0 405 1.0 406 0.0 407 1.0 408 8.0 Name: fans_num, Length: 409, dtype: float64
6 添加索引
import pandas as pd df1 = pd.read_excel("demo.xlsx") df1.columns = ['编号', '序号', '姓名', '消费金额'] print(df1) # 输出结果 编号 序号 姓名 消费金额 0 A2 1002 小王 2000 1 A3 1003 小明 3000 2 A4 1004 小朱 4000 3 A5 1005 小黑 5000
set_index()
这个方法,在括号中指明需要使用的列名即可:
import pandas as pd df1 = pd.read_excel("demo.xlsx") print(df1.set_index('编号')) # 输出结果 序号 姓名 消费金额 编号 A2 1002 小王 2000 A3 1003 小明 3000 A4 1004 小朱 4000 A5 1005 小黑 5000
7.使用 .str()
方法来清洗 columns
.str属性
是pandas里的一种提升字符串操作速度的方法,并有大量的Python字符串或编译的正则表达式上的小操作,例如.split()
,.replace()
,和.capitalize()
。
将我们数据中所有的某一列字符数据改成大写:
data['movie_title'].str.upper()
pandas.Series.str.extract 正则提取数据
8.使用 DataFrame.applymap()
函数按元素的清洗整个数据集
>>> def get_citystate(item): ... if ' (' in item: ... return item[:item.find(' (')] ... elif '[' in item: ... return item[:item.find('[')] ... else: ... return item
pandas的applymap()
只用一个参数,就是要应用到每个元素上的函数(callable)
>>> towns_df = towns_df.applymap(get_citystate)