import numpy as npimport pandas as pd
检测与处理重复值 duplicated()函数
# #查询重复的内容# data[data.duplicated()]# #统计重复行的数量# data.duplicated().sum()#DataFrame.duplicate(subset=None, keep='first')
df = pd.DataFrame({ 'brand': ['Yum Yum', 'Yum Yum', 'Indomie', 'Indomie', 'Indomie'], 'style': ['cup', 'cup', 'cup', 'pack', 'pack'], 'rating': [4, 4, 3.5, 15, 5]})df
|
brand |
style |
rating |
| 0 |
Yum Yum |
cup |
4.0 |
| 1 |
Yum Yum |
cup |
4.0 |
| 2 |
Indomie |
cup |
3.5 |
| 3 |
Indomie |
pack |
15.0 |
| 4 |
Indomie |
pack |
5.0 |
df.duplicated()
0 False1 True2 False3 False4 Falsedtype: bool
df.duplicated(subset = ['brand'])
0 False1 True2 False3 True4 Truedtype: bool
df[df.duplicated()] #通过布尔索引,
|
brand |
style |
rating |
| 1 |
Yum Yum |
cup |
4.0 |
df.duplicated().sum()
1
删除重复值
df.drop_duplicates()
检测缺失值
df = pd.DataFrame(dict(age=[5, 6, np.NaN], born=[pd.NaT, pd.Timestamp('1939-05-27'), pd.Timestamp('1940-04-25')], name=['Alfred', 'Batman', ''], toy=[None, 'Batmobile', 'Joker']))df
|
age |
born |
name |
toy |
| 0 |
5.0 |
NaT |
Alfred |
None |
| 1 |
6.0 |
1939-05-27 |
Batman |
Batmobile |
| 2 |
NaN |
1940-04-25 |
|
Joker |
df.isna()
|
age |
born |
name |
toy |
| 0 |
False |
True |
False |
True |
| 1 |
False |
False |
False |
False |
| 2 |
True |
False |
False |
False |
df.notna()
|
age |
born |
name |
toy |
| 0 |
True |
False |
True |
False |
| 1 |
True |
True |
True |
True |
| 2 |
False |
True |
True |
True |
处理缺失值
#删除法# pandas.DataFrame.dropna( self, axis=0, how='any', # thresh=None, subset=None, inplace=False)#axis 接收0或1。表示轴向,0为删除记录(行),1为删除特征(列)。默认为0。#how 接收特定string。表示删除的形式。any表示只要有缺失值存在就执行删除操作。all 表示当且仅当全部为缺失值时执行删除操作。默认为any。#subset 接收类array数据。表示进行去重的列∕行。默认为None,表示所有列/行。#inplace 接收boolean。表示是否在原表上进行操作。默认为False。
dates = pd.date_range('20130101', periods=6) df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])df.iloc[0,1] = np.nan df.iloc[1,2] = np.nandf
|
A |
B |
C |
D |
| 2013-01-01 |
0 |
NaN |
2.0 |
3 |
| 2013-01-02 |
4 |
5.0 |
NaN |
7 |
| 2013-01-03 |
8 |
9.0 |
10.0 |
11 |
| 2013-01-04 |
12 |
13.0 |
14.0 |
15 |
| 2013-01-05 |
16 |
17.0 |
18.0 |
19 |
| 2013-01-06 |
20 |
21.0 |
22.0 |
23 |
# df1接收,判断是否有缺失数据 NaN, 为 True 表示缺失数据: df1=df.isnull() df1
|
A |
B |
C |
D |
| 2013-01-01 |
False |
True |
False |
False |
| 2013-01-02 |
False |
False |
True |
False |
| 2013-01-03 |
False |
False |
False |
False |
| 2013-01-04 |
False |
False |
False |
False |
| 2013-01-05 |
False |
False |
False |
False |
| 2013-01-06 |
False |
False |
False |
False |
#每一列的缺失数据 数量df2=df.isnull().sum() df2
A 0B 1C 1D 0dtype: int64
#整个表的缺失数据 df2.sum()
2
# df1接收,去掉有 NaN 的行, 可以使用 dropna 一旦出现NaN就去 除整行 df3=df.dropna(axis=0,how='any') df3
|
A |
B |
C |
D |
| 2013-01-03 |
8 |
9.0 |
10.0 |
11 |
| 2013-01-04 |
12 |
13.0 |
14.0 |
15 |
| 2013-01-05 |
16 |
17.0 |
18.0 |
19 |
| 2013-01-06 |
20 |
21.0 |
22.0 |
23 |
#替换法# 替换法是指用一个特定的值替换缺失值。# 特征可分为离散型和连续型,两者出现缺失值时的处理方法也是不同的。# 缺失值所在特征为连续型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来代替缺失值。# 缺失值所在特征为离散型时,则经常选择使用众数来替换缺失值。# pandas.DataFrame.fillna(value=None, method=None, axis=None, # inplace=False, limit=None)
#value 接收scalar,dict,Series或者DataFrame。表示用来替换缺失值的值。无默认。#method 接收特定string。backfill或bfill表示使用下一个非缺失值填补缺失值。# pad或ffill表示使用上一个非缺失值填补缺失值。默认为None。#axis 接收0或1。表示轴向。默认为1。#inplace 接收boolean。表示是否在原表上进行操作。默认为False。# limit 接收int。表示填补缺失值个数上限,超过则不进行填补。默认为None。
dates = pd.date_range('20130101', periods=6) df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])df.iloc[0,1] = np.nan df.iloc[1,2] = np.nandf
|
A |
B |
C |
D |
| 2013-01-01 |
0 |
NaN |
2.0 |
3 |
| 2013-01-02 |
4 |
5.0 |
NaN |
7 |
| 2013-01-03 |
8 |
9.0 |
10.0 |
11 |
| 2013-01-04 |
12 |
13.0 |
14.0 |
15 |
| 2013-01-05 |
16 |
17.0 |
18.0 |
19 |
| 2013-01-06 |
20 |
21.0 |
22.0 |
23 |
# 固定值填补df2 = df.fillna(value = 0)df2
|
A |
B |
C |
D |
| 2013-01-01 |
0 |
0.0 |
2.0 |
3 |
| 2013-01-02 |
4 |
5.0 |
0.0 |
7 |
| 2013-01-03 |
8 |
9.0 |
10.0 |
11 |
| 2013-01-04 |
12 |
13.0 |
14.0 |
15 |
| 2013-01-05 |
16 |
17.0 |
18.0 |
19 |
| 2013-01-06 |
20 |
21.0 |
22.0 |
23 |
# 相似值填补df3 = df.fillna(method='pad',axis=1)df3
|
A |
B |
C |
D |
| 2013-01-01 |
0.0 |
0.0 |
2.0 |
3.0 |
| 2013-01-02 |
4.0 |
5.0 |
5.0 |
7.0 |
| 2013-01-03 |
8.0 |
9.0 |
10.0 |
11.0 |
| 2013-01-04 |
12.0 |
13.0 |
14.0 |
15.0 |
| 2013-01-05 |
16.0 |
17.0 |
18.0 |
19.0 |
| 2013-01-06 |
20.0 |
21.0 |
22.0 |
23.0 |
插值法
# 删除法简单易行,但是会引起数据结构变动,样本减少;替换法使用难度较低,但是会影响数据的标准差,导致信息量变动。# 在面对数据缺失问题时,除了这两种方法之外,还有一种常用的方法—插值法。