版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leadingsci/article/details/89290696
文章目录
5.1 缺失值处理
NaN代表缺失值
df = pd.read_csv(r"C:\Users\leadi\Python\01.python\input\train-pivot.csv",encoding="gbk")
df
# 查看
df.info(0
# 判断是否缺失
df.isnull()
5.1.2 缺失值删除
删除含有缺失值的行
df.dropna()
只删除,整行均为NaN的行
df.dropna(how="all")
5.1.3 缺失值填充
一般情况下,只要数据缺失比例不是高于30%,尽量别删除,而是选择填充;
用0来填充
df.fillna(0)
指明列填充
df.fillna({"客户分类":"A类"})
df.fillna({"客户分类":"A类","区域":"一线城市",})
5.2 重复值处理
drop_duplicates() ,对所有值进行重复值判断,且默认保留第一个(行)值
df = pd.read_csv(r"C:\Users\leadi\Python\01.python\input\train-pivot.csv",encoding="gbk")
df
删除整行
df.drop_duplicates()
只对某一列或多列进行判断
多列去重时,要两列均为重复时,才视为重复。
df = pd.read_csv(r"C:\Users\leadi\Python\01.python\input\train-pivot.csv",encoding="gbk")
df.drop_duplicates(subset = "用户ID")
df.drop_duplicates(subset = ["用户ID","区域"])
问题:为什么,区域出现有重复,而不删掉
去重保留哪一个
# keep默认为first
df.drop_duplicates(subset = ["用户ID","是否省会"],keep="first")
# last
df.drop_duplicates(subset = ["用户ID","是否省会"],keep="last")
# False,把全部重复值删掉
df.drop_duplicates(subset = ["用户ID","是否省会"],keep=False)
5.3 异常值的检测与处理
5.3.1 异常值检测
- 根据业务经验划定不同指标的正常范围,超出该范围的值为异常值;
- 绘制箱型图,大于或小于上边缘,下边缘的点为异常值;
- 如果数据服从正态分布,则可以利用3d原则:如果一个值的平均值超过3倍标准差,则为异常值
5.3.2 异常值处理
- 删除
- 把异常值当作缺失值填充
- 把异常值当作特殊情况,研究异常值出现的原因
先筛选不存在异常值的表出来,得到异常值的新表。再对异常值进行替换replace();
5.4 数据类型转换
5.4.1 数据类型
6种数据类型
- int
- float
- object —— 对象类型,用O表示。如含有数字和英文组合时。
- string_ —— 字符串类型
- unicode_——固定长度的unicode类型
- datetime64[ns] ——时间格式
**info()**查看整表
dtype查看列
df = pd.read_csv(r"C:\Users\leadi\Python\01.python\input\train-pivot.csv",encoding="gbk")
print(df)
df.info()
df["区域"].dtype
输出:
用户ID 客户分类 区域 是否省会 7月销量 8月销量 9月销量
0 59224 A类 一线城市 是 6 20 0
1 55295 B类 三线城市 否 37 27 35
2 46035 A类 二线城市 是 8 1 8
3 46035 A类 二线城市 是 8 1 8
4 2459 C类 一线城市 是 7 8 14
5 22179 B类 三线城市 否 9 12 4
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 7 columns):
用户ID 6 non-null int64
客户分类 6 non-null object
区域 6 non-null object
是否省会 6 non-null object
7月销量 6 non-null int64
8月销量 6 non-null int64
9月销量 6 non-null int64
dtypes: int64(4), object(3)
memory usage: 416.0+ bytes
Out[23]:
dtype('O')
5.4.2 类型转换
df[“列名”].astype(“转换类型”)
df = pd.read_csv(r"C:\Users\leadi\Python\01.python\input\train-pivot.csv",encoding="gbk")
df
df["7月销量"].dtype
df["7月销量"].astype("float64")
输出:
0 6.0
1 37.0
2 8.0
3 8.0
4 7.0
5 9.0
Name: 7月销量, dtype: float64
5.5 索引设置
df = pd.read_csv(r"C:\Users\leadi\Python\01.python\input\train-pivot.csv",encoding="gbk")
df
表格没有索引时,默认从0开始。
列没有索引时,可以指定字段
df.columns = ["a","b","c","d","e","f","g"]
df
# 添加行索引
#df.index = ["a","b","c","d","e","f","g"]
5.5.2 重新设置索引
set_index()
df.set_index("用户ID")
问题:索引后,原来的那一列,也在表格之外了
set_index()传入两个或多个列名,叫作层次索引,一般用在某一一列含有多个值的情况下。
df.set_index(["是否省会","客户分类"])
5.5.3 重命名索引
rename()
df.rename(columns = {"用户ID":"新用户ID","区域":"新区域"})
同时命名行索引,列索引
index
df.rename(columns = {"用户ID":"新用户ID","区域":"新区域"},index = {0:"a",1:"b"})
5.5.4 重置索引
reset_index(level = None,drop= False,inplace=False)
- level 指定层次化索引的第几级
- drop 是否将原索引删掉
- inplace 是否修改原数据表
当去重,或经过筛选后的新表格,index仍保持原来,而按顺序的index,需要对index重新整理
如当index出现缺失,或重复
df2 = df.rename(columns = {"用户ID":"新用户ID","区域":"新区域"},index = {0:"a",1:"2"})
df2
df2.reset_index(drop=True)
对多重索引进行处理
df.set_index(["是否省会","客户分类"])
df2 = df.set_index(["是否省会","客户分类"])
df2.reset_index()
# 只对0级恢复
df2.reset_index(level = 0)
将原索引删除
df2.reset_index(drop=True)