在开始正式的数据分析前,我们需要对不合理的数据进行预先的处理。
常见的不合理数据有缺失数据、重复数据、异常数据等
对于各种原因造成的缺失空值,一般有两种处理方式:
Ctrl+g调出"定位"窗口,打开"定位条件",选择"空值",即可选中该区域内的所有空值。

在Pandas中,"NaN"代表数字型空值
df_obj.info()
之前我们利用这个方法来查看字段的数据类型,但它也能显示出空值的信息。
如:
grades_df.info()
"""
Index: 18 entries, 包宏伟 to 张桂花
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 学号 18 non-null int64
1 班级 18 non-null object
2 语文 18 non-null float64
3 数学 16 non-null float64
4 英语 18 non-null int64
5 生物 17 non-null float64
6 地理 18 non-null int64
7 历史 18 non-null int64
8 政治 18 non-null int64
9 总分 18 non-null float64
10 平均分 18 non-null float64
dtypes: float64(5), int64(5), object(1)
memory usage: 1.7+ KB
"""
#18个行索引,第3列16个非空值(non-null),第5列有17个非空值,说明第3列有18-16=2个缺失值,第5列有18-17=1个缺失值
df_obj.isnull()
True代表为缺失空值DataFrame对象如:
print(grades_df.isnull())
"""
学号 班级 语文 数学 英语 生物 地理 历史 政治 总分 \
姓名
包宏伟 False False False False False False False False False False
陈万地 False False False False False False False False False False
杜学江 False False False False False False False False False False
符合 False False False False False True False False False False
吉祥 False False False True False False False False False False
李北大 False False False False False False False False False False
李娜娜 False False False False False False False False False False
刘康锋 False False False False False False False False False False
刘鹏举 False False False True False False False False False False
倪冬声 False False False False False False False False False False
齐飞扬 False False False False False False False False False False
苏解放 False False False False False False False False False False
孙玉敏 False False False False False False False False False False
王清华 False False False False False False False False False False
谢如康 False False False False False False False False False False
闫朝霞 False False False False False False False False False False
曾令煊 False False False False False False False False False False
张桂花 False False False False False False False False False False
平均分
姓名
包宏伟 False
陈万地 False
杜学江 False
符合 False
吉祥 False
李北大 False
李娜娜 False
刘康锋 False
刘鹏举 False
倪冬声 False
齐飞扬 False
苏解放 False
孙玉敏 False
王清华 False
谢如康 False
闫朝霞 False
曾令煊 False
张桂花 False
"""
选中缺失值后,右键选择"删除"–>“整行”

df_obj.dropna(axis: 'Axis' = 0,
how: 'str' = 'any',
inplace: 'bool' = False,
)
axis设置删除的是行还是列。为0代表行,为1代表列。默认为列。how设置删除条件。为"any"代表只要本行/列出现空值就删除。为"all"代表只有本行全为空值才删除。默认为"any"inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False如:
df = pd.DataFrame([["张三", 18, 120],[None, None, 130],
[None, None, None], ["李四", 17, 100] ],
index=[1, 2, 3, 4],
columns=['姓名', '年龄', '得分'])
print(df)
"""
姓名 年龄 得分
1 张三 18.0 120.0
2 None NaN 130.0
3 None NaN NaN
4 李四 17.0 100.0
"""
new_df1=df.dropna(how="all")
print(new_df1)
"""
姓名 年龄 得分
1 张三 18.0 120.0
2 None NaN 130.0
4 李四 17.0 100.0
"""
new_df2=df.dropna(how="any")
print(new_df2)
"""
姓名 年龄 得分
1 张三 18.0 120.0
4 李四 17.0 100.0
"""
print(df) # 以上操作默认在返回的新表中操作,不会影响原表
"""
姓名 年龄 得分
1 张三 18.0 120.0
2 None NaN 130.0
3 None NaN NaN
4 李四 17.0 100.0
"""
当缺失值占整行数据少于 30 % 30\% 30%时,我们可以考虑把缺失值替换成其他值。
通过"定位条件"选中所有空值后,在第一个空值中输入要替换成的目标值(常用0、众数、平均数、相邻数据等),Ctrl+Enter ,即可替换所有空值。
df.fillna(value: 'object | ArrayLike | None' = None,
method: 'FillnaOptions | None' = None,
axis: 'Axis | None' = None,
inplace: 'bool' = False,
)
value设置替换值。可以传入单个替换值。也可以传入key为行/列索引,value为该行/列的替换值组成的字典。
method设置可选的替换方式。pad或ffill为上一个非空值。backfill或bfill为下一个非空值。
axis设置替换的单位是行还是列。为0代表行,为1代表列。默认为列。
inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False
如:
df = pd.DataFrame([["张三", 18, 120],[None, None, 130],
[None, None, None], ["李四", 17, 100] ],
index=[1, 2, 3, 4],
columns=['姓名', '年龄', '得分'])
new_df1=df.fillna(0)
print(new_df1)
"""
姓名 年龄 得分
1 张三 18.0 120.0
2 0 0.0 130.0
3 0 0.0 0.0
4 李四 17.0 100.0
"""
new_df2=df.fillna({"姓名":"佚名","年龄":18,"得分":0})
print(new_df2)
"""
姓名 年龄 得分
1 张三 18.0 120.0
2 佚名 18.0 130.0
3 佚名 18.0 0.0
4 李四 17.0 100.0
"""
重复值一般直接删除。
选中表格区域,在菜单栏依次选择"数据">“数据工具">“删除重复值”,勾选想要检测重复值的列。只要这些选中的列数据全部相同,就会删除重复行,只留下一个。
df.drop_duplicates(subset: 'Hashable | Sequence[Hashable] | None' = None,
keep: "Literal['first'] | Literal['last'] | Literal[False]" = 'first',
inplace: 'bool' = False,
ignore_index: 'bool' = False)
subset设置想要检测重复值的列。可以传入一个列表。默认为所有列。keep设置保留的数据的位置。'first'代表第一个,'last'代表最后一个,None代表一个都不留。inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为Falseignore_index设置是否重新设置默认索引(从0开始的整数)。False代表不重新设置,True代表重新设置。如:
df = pd.DataFrame([["张三", 18, 120], ["张三", 18, 120], ["张三", 17, 130],
["李四", 17, 120], ["李四", 17, 100]],
index=[1, 2, 3, 4, 5],
columns=['姓名', '年龄', '得分'])
new_df1=df.drop_duplicates()
print(new_df1)
"""
姓名 年龄 得分
1 张三 18 120
3 张三 17 130
4 李四 17 120
5 李四 17 100
"""
new_df2=df.drop_duplicates(subset=['姓名','年龄'])
print(new_df2)
"""
1 张三 18 120
3 张三 17 130
4 李四 17 120
"""
new_df3=df.drop_duplicates(ignore_index=True)
print(new_df3)
"""
姓名 年龄 得分
0 张三 18 120
1 张三 17 130
2 李四 17 120
3 李四 17 100
"""
异常值指非正常数据,要么过高,要么过低,总之不符合实际。
检测异常值的常用策略:
处理异常值的常用策略:
DataFrame表对象replace方法其他章节详述
选中某一列,在"数字"栏中可查看其数据类型:

Pandas的主要数据类型有以下几种:
可以使用前面介绍过的info()方法来查看整个表的数据类型及其他信息,还可以通过dtypes属性只获取整个表的数据类型,列的dtype属性获取特定列的数据类型。
df.dtypes
df[列索引].dtype
如:
df = pd.DataFrame(
{
"学科": ["数学分析", "高等代数", "解析几何"],
"学期": [3, 2, 1],
"学分": [18, 12, 4],
"是否必修": [True, True, False]
},
index=range(1, 4))
print(df["学科"].dtype)
print(df["学期"].dtype)
print(df["学分"].dtype)
print(df["是否必修"].dtype)
"""
object
int64
int64
bool
"""
print(df.dtypes)
"""
学科 object
学期 int64
学分 int64
是否必修 bool
dtype: object
"""
不同的数据类型能进行的操作不同。为了满足需求,需要将数据强制转换为正确的类型。
选中某列,同样在"数字"栏,点击类型完成转换。有时可以看到明显的格式变化。

df.astype(dtype, copy: 'bool_t' = True, errors: 'str' = 'raise')
dtype可以传入字典,key为列索引,value为转化的目标类型copy设置是否复制,即不在原表上操作,返回新表,默认为Trueerrors设置转化失败后的行为。'raise'为报错,'ignore'为忽视。默认'raise'如:
new_df=df.astype({"学期":"object","学分":"float64"})
print(df.dtypes)
"""
学科 object
学期 int64
学分 int64
是否必修 bool
dtype: object
"""
print(new_df.dtypes)
"""
学科 object
学期 object
学分 float64
是否必修 bool
dtype: object
"""
在表的第一行上方插入新的一行,在表的第一列左方插入新的一列。
选中第一行/第一列,右击"插入>整行/整列"
在新行新列中添加索引
DataFrame对象默认以0开始的整数数列为索引。
可以通过index属性修改行索引,columns属性修改列索引。
df.index=[...]
df.columns=[...]
如:
df = pd.DataFrame([["a", "A"], ["b", "B"], ["c", "C"]])
print(df)
"""
0 1
0 a A
1 b B
2 c C
"""
df.index = range(1, 4)
df.columns = ["小写", "大写"]
print(df)
"""
小写 大写
1 a A
2 b B
3 c C
"""
将该列拖动到第一列即可
df.set_index(keys,
drop: 'bool' = True,
inplace: 'bool' = False
)
key可为单个列索引,或列索引列表(称为层次化索引)drop设置是否删除表中的该列,仅将其设为索引。默认为Trueinplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False如:
df = pd.DataFrame({
"商品名称": ["苹果", "梨", "手机", "电脑", "玩偶", "玩具汽车"],
"商品种类": ["食品", "食品", "电子产品", "电子产品", "玩具", "玩具"],
"商品编号": [1, 2, 1, 2, 1, 2],
"商品单价": [2, 3, 4000, 5000, 100, 200]
})
print(df)
"""
商品名称 商品种类 商品编号 商品单价
0 苹果 食品 1 2
1 梨 食品 2 3
2 手机 电子产品 1 4000
3 电脑 电子产品 2 5000
4 玩偶 玩具 1 100
5 玩具汽车 玩具 2 200
"""
new_df1 = df.set_index("商品编号")
print(new_df1)
"""
商品种类 商品编号 商品单价
商品名称
苹果 食品 1 2
梨 食品 2 3
手机 电子产品 1 4000
电脑 电子产品 2 5000
玩偶 玩具 1 100
玩具汽车 玩具 2 200
"""
new_df2 = df.set_index(["商品种类", "商品编号"])
print(new_df2)
"""
商品名称 商品单价
商品种类 商品编号
食品 1 苹果 2
2 梨 3
电子产品 1 手机 4000
2 电脑 5000
玩具 1 玩偶 100
2 玩具汽车 200
"""
层次化索引可实现多维表格
直接修改索引名即可。
df.rename(index: 'Renamer | None' = None,
columns: 'Renamer | None' = None,
inplace: 'bool' = False,
errors: 'str' = 'ignore',)
index设置行索引命名的过程。可以传入字典,key为旧索引名,value为新索引名。columns设置列索引命名的过程。可以传入字典,key为旧索引名,value为新索引名。inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为Falseerrors设置转化失败后的行为。'raise'为报错,'ignore'为忽视。默认'raise'如:
new_df3=df.rename(columns={"商品名称":"名称","商品种类":"种类","商品编号":"编号"},index={0:6})
print(new_df3)
"""
名称 种类 编号 商品单价
6 苹果 食品 1 2
1 梨 食品 2 3
2 手机 电子产品 1 4000
3 电脑 电子产品 2 5000
4 玩偶 玩具 1 100
5 玩具汽车 玩具 2 200
"""
将行索引恢复为列
如果是一列的行索引,直接拖动离开第一列即可。
如果是层次化索引,复制、粘贴、删除以恢复
df.reset_index(level: 'Hashable | Sequence[Hashable] | None' = None,
drop: 'bool' = False,
inplace: 'bool' = False
)
level设置要恢复的行索引对应的列。默认所有层全部恢复。可指定层数(0开始)或列名。drop设置是否删除对应索引,不把它恢复成数据列。默认为Falseinplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False如:
new_df4=new_df2.reset_index(level=1)
print(new_df4)
"""
商品编号 商品名称 商品单价
商品种类
食品 1 苹果 2
食品 2 梨 3
电子产品 1 手机 4000
电子产品 2 电脑 5000
玩具 1 玩偶 100
玩具 2 玩具汽车 200
"""
new_df5=new_df2.reset_index(level="商品编号")
print(new_df5)
"""
商品种类 商品名称 商品单价
商品编号
1 食品 苹果 2
2 食品 梨 3
1 电子产品 手机 4000
2 电子产品 电脑 5000
1 玩具 玩偶 100
2 玩具 玩具汽车 200
"""
new_df6=new_df2.reset_index()
print(new_df6)
"""
商品种类 商品编号 商品名称 商品单价
0 食品 1 苹果 2
1 食品 2 梨 3
2 电子产品 1 手机 4000
3 电子产品 2 电脑 5000
4 玩具 1 玩偶 100
5 玩具 2 玩具汽车 200
"""
reset_index()方法常用于数据分组、数据透视表中