重复值处理
1.1判断是否有重复值
import pandas as pd
data=pd.read_excel(r'F:\学习资料&笔记\素材\删除重复值素材.xlsx')
print(data)
打印的数据结果
autoid id name kcid kcname score
1 2005001 张三 1 数学 69
2 2005002 李四 1 数学 89
3 2005001 张三 2 语文 90
4 2005002 李四 2 语文 89
5 2005001 张三 1 数学 69
6 2005002 李四 1 数学 89
is1=data.duplicated()
is2=data.duplicated(['id','kcname'])
print(isduplicates1)
print(isduplicates2)
autoid id name kcid kcname score is1 is2
1 2005001 张三 1 数学 69 False False
2 2005002 李四 1 数学 89 False False
3 2005001 张三 2 语文 90 False False
4 2005002 李四 2 语文 89 False False
5 2005001 张三 1 数学 69 False True
6 2005002 李四 1 数学 89 False True
- is1 对全表的数据进行重复判断,由于autoid不同,所以is1 结果全为false
- is2 对id,和 kcname 两个字段进行重复判断,故最后两行数据判断结果为true
1.2删除重复值
new_data1=data.drop_duplicates(['id'])
new_data2=data.drop_duplicates(['id','kcname'])
new_data3=data.drop_duplicates(subset=['id','kcname'],keep='last', inplace=False)
new_data1 结果:按照ID去重,默认取第一条数据
autoid id name kcid kcname score
1 2005001 张三 1 数学 69
2 2005002 李四 1 数学 89
new_data2 结果:按照ID,kcname去重,默认取第一条数据
autoid id name kcid kcname score
1 2005001 张三 1 数学 69
2 2005002 李四 1 数学 89
3 2005001 张三 2 语文 90
4 2005002 李四 2 语文 89
new_data3 结果:按照ID,kcname去重,重复取最后一条数据
autoid id name kcid kcname score
3 2005001 张三 2 语文 90
4 2005002 李四 2 语文 89
5 2005001 张三 1 数学 69
6 2005002 李四 1 数学 89
2.缺失值处理
2.1判断是否有缺失值
import pandas as pd
data=pd.read_excel(r'F:\学习资料&笔记\素材\缺失值素材.xlsx')
print(data)
print(data.info())
id name kcid kcname kcname2 score1 score2
0 2005001 张三 1.0 数学 数学 69.0 NaN
1 2005002 李四 1.0 数学 NaN 89.0 NaN
2 2005001 张三 2.0 语文 语文 90.0 NaN
3 2005002 李四 2.0 语文 NaN 89.0 NaN
4 2005001 张三 NaN 英语 英语 NaN 60.0
5 2005002 李四 NaN 英语 NaN NaN 86.0
6 2005001 NaN 4.0 数学 数学 NaN 23.0
7 2005002 NaN 4.0 数学 NaN NaN 90.0
info() 函数用来查看dataframe 字段信息以及字段中的数据信息
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8 entries, 0 to 7
Data columns (total 7 columns):
id 8 non-null int64
name 6 non-null object
kcid 6 non-null float64
kcname 8 non-null object
kcname2 4 non-null object
score1 4 non-null float64
score2 4 non-null float64
dtypes: float64(3), int64(1), object(3)
memory usage: 528.0+ bytes
None
nan_all=data.isnull() '获得所有数据框中的N值'
nan1=data.isnull().any() '获得含有NA的列'
nan2=data.isnull().all() '获得全部为NA的列'
print(nan1)
print(nan2)
nan1结果 nan2结果
id False False
name True False
kcid True False
kcname False False
kcname2 True False
score1 True False
score2 True False
缺失值处理
2.2.1 向上填充
data['kcname2']=data['kcname2'].fillna(method='ffill')
print(data)
id name kcid kcname kcname2 score1 score2
0 2005001 张三 1.0 数学 数学 69.0 NaN
1 2005002 李四 1.0 数学 数学 89.0 NaN
2 2005001 张三 2.0 语文 语文 90.0 NaN
3 2005002 李四 2.0 语文 语文 89.0 NaN
4 2005001 张三 NaN 英语 英语 NaN 60.0
5 2005002 李四 NaN 英语 英语 NaN 86.0
6 2005001 NaN 4.0 数学 数学 NaN 23.0
7 2005002 NaN 4.0 数学 数学 NaN 90.0
2.2.3 向下填充
data['kcname2']=data['kcname2'].fillna(method='bfill')
print(data)
id name kcid kcname kcname2 score1 score2
0 2005001 张三 1.0 数学 数学 69.0 NaN
1 2005002 李四 1.0 数学 语文 89.0 NaN
2 2005001 张三 2.0 语文 语文 90.0 NaN
3 2005002 李四 2.0 语文 英语 89.0 NaN
4 2005001 张三 NaN 英语 英语 NaN 60.0
5 2005002 李四 NaN 英语 数学 NaN 86.0
6 2005001 NaN 4.0 数学 数学 NaN 23.0
7 2005002 NaN 4.0 数学 NaN NaN 90.0
2.2.3 不同列填充不同的值
data=data.fillna({'name':'王二','kcid':'3'})
print(data)
id name kcid kcname kcname2 score1 score2
0 2005001 张三 1 数学 数学 69.0 NaN
1 2005002 李四 1 数学 NaN 89.0 NaN
2 2005001 张三 2 语文 语文 90.0 NaN
3 2005002 李四 2 语文 NaN 89.0 NaN
4 2005001 张三 3 英语 英语 NaN 60.0
5 2005002 李四 3 英语 NaN NaN 86.0
6 2005001 王二 4 数学 数学 NaN 23.0
7 2005002 王二 4 数学 NaN NaN 90.0
2.2.4 不同列填充不同的值
data['score']=data['score1'].fillna(data['score2'])
print(data)
id name kcid kcname kcname2 score1 score2 score
0 2005001 张三 1.0 数学 数学 69.0 NaN 69.0
1 2005002 李四 1.0 数学 NaN 89.0 NaN 89.0
2 2005001 张三 2.0 语文 语文 90.0 NaN 90.0
3 2005002 李四 2.0 语文 NaN 89.0 NaN 89.0
4 2005001 张三 NaN 英语 英语 NaN 60.0 60.0
5 2005002 李四 NaN 英语 NaN NaN 86.0 86.0
6 2005001 NaN 4.0 数学 数学 NaN 23.0 23.0
7 2005002 NaN 4.0 数学 NaN NaN 90.0 90.0