pandas数据清理
pandas数据分析
In [1]:
import numpy as np
import pandas as pd
一、数据清洗
读取"豆瓣电影数据.xlsx"文件进行分析清洗
In [2]:
df1 = pd.read_excel('豆瓣电影数据.xlsx', index_col=0)
df1.head()
Out[2]:
1.1 缺失值及异常值的处理
方法 | 说明 |
---|---|
dropna | 根据标签中缺失值进行过滤,删除缺失值 |
fillna | 对缺失值进行填充 |
isnull | 返回一个布尔值对象,判断哪些值是缺失值 |
notnull | isnull的否定值 |
1.1.1 缺失值的处理
- 丢弃
- drop
- 填充缺失值
- fillna
In [3]:
df1.info()
In [4]:
df1.describe()
Out[4]:
1. 查看名字中有缺失值的行数据
In [5]:
df1[df1.名字.isnull()].head()
Out[5]:
In [7]:
tmp1 = df1[df1.名字.isnull()].index
tmp1
Out[7]:
In [8]:
df1.drop(tmp1,inplace=True)
In [9]:
df1[df1.名字.isnull()]
Out[9]:
1.1.2 对于异常值的处理
- 比如投票人数小于0, 投票人数为小数了
- 在不影响整体数据分布时,可以直接删除就行
- 其他属性异常值,以格式转换为主
1. 投票人数小于0和投票人数为小数的数据
In [12]:
idx1 = df1[(df1.投票人数 < 0) | (df1.投票人数 % 1 != 0)].index
df1.drop(idx1, inplace=True)
2.验证清理情况
In [13]:
df1[(df1.投票人数 < 0) | (df1.投票人数 % 1 != 0)]
Out[13]:
In [14]:
df1.head()
Out[14]:
In [18]:
df1.iloc[3, 7] = 9.4
In [19]:
df1.head()
Out[19]:
1.2 数据格式转换
- 为了方便后续的统计分析和数据处理,需要对某些列的格式进行优化
1. 查看投票人数列的格式
In [20]:
df1.投票人数.dtype
Out[20]:
- 利用astype进行格式的转换
In [21]:
df1.投票人数 = df1.投票人数.astype(np.int32)
df1.head()
Out[21]:
2.查看年代列的格式
- 年代的格式是字符类型,需要转换为数字类型
In [23]:
df1.年代.dtype
Out[23]:
In [24]:
df1.年代.astype(np.int32)
In [25]:
df1[df1.年代 == '2008\u200e']
Out[25]:
In [27]:
df1.loc[15205, "年代"] = 2008
In [28]:
df1["年代"] = df1.年代.astype(np.int32)
In [30]:
df1.年代.dtype
Out[30]:
In [31]:
df1.describe()
Out[31]:
3. 查看时长列格式
In [32]:
df1.时长.dtype
Out[32]:
In [33]:
df1.时长.astype(np.int32)
In [34]:
df1[df1.时长 == '8U']
Out[34]:
In [35]:
df1.drop([31644], inplace=True)
In [36]:
df1.时长.astype(np.int32)
In [37]:
df1[df1.时长=='12J']
Out[37]:
In [38]:
df1.drop([32949], inplace=True)
In [39]:
df1["时长"] = df1.时长.astype(np.int32)
In [40]:
df1.head()
Out[40]:
1.3 利用基本统计寻找异常值
- 通过描述性统计,可以发现一些异常值,很多异常值是需要我们逐步去发现的
In [41]:
df1.describe()
Out[41]:
In [42]:
df1.info()
In [43]:
df1[df1.年代 > 2019]
Out[43]:
In [45]:
df1[df1.时长 > 1000]
Out[45]:
In [46]:
df1.drop(df1[df1.年代>2019].index, inplace=True)
df1.drop(df1[df1.时长>1000].index, inplace=True)
In [47]:
df1.describe()
Out[47]:
1.4 在清洗数据后,对index进行重新赋值
In [48]:
df1[230:235]
Out[48]:
In [49]:
df1.index = range(len(df1))
In [50]:
df1[230:235]
Out[50]:
1.5 数据内容的修改
- 获取产地的唯一值
In [51]:
df1.产地.unique()
Out[51]:
- 在产地列中,很多重复值,比如USA和美国, 西德和德国
- 我们可以通过数据替换的方法,将这些相同国家的电影数据合并起来。
In [52]:
df1.产地.replace("USA", "美国", inplace=True)
In [53]:
df1.产地.replace(["USA" ,"西德", "苏联"], ["美国", "德国", "俄罗斯"], inplace=True)
In [54]:
df1.产地.unique()
Out[54]:
1.6 保存最终结果¶
In [58]:
df1.to_excel('movie.xlsx')