1. import numpy as np
    2. import pandas as pd

    检测与处理重复值 duplicated()函数

    1. # #查询重复的内容
    2. # data[data.duplicated()]
    3. # #统计重复行的数量
    4. # data.duplicated().sum()
    5. #DataFrame.duplicate(subset=None, keep='first')
    1. df = pd.DataFrame({
    2. 'brand': ['Yum Yum', 'Yum Yum', 'Indomie', 'Indomie', 'Indomie'],
    3. 'style': ['cup', 'cup', 'cup', 'pack', 'pack'],
    4. 'rating': [4, 4, 3.5, 15, 5]
    5. })
    6. 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
    1. df.duplicated()
    1. 0 False
    2. 1 True
    3. 2 False
    4. 3 False
    5. 4 False
    6. dtype: bool
    1. df.duplicated(subset = ['brand'])
    1. 0 False
    2. 1 True
    3. 2 False
    4. 3 True
    5. 4 True
    6. dtype: bool
    1. df[df.duplicated()] #通过布尔索引,
    brand style rating
    1 Yum Yum cup 4.0
    1. df.duplicated().sum()
    1. 1

    删除重复值

    1. df.drop_duplicates()

    检测缺失值

    1. df = pd.DataFrame(dict(age=[5, 6, np.NaN],
    2. born=[pd.NaT, pd.Timestamp('1939-05-27'),
    3. pd.Timestamp('1940-04-25')],
    4. name=['Alfred', 'Batman', ''],
    5. toy=[None, 'Batmobile', 'Joker']))
    6. 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
    1. df.isna()
    age born name toy
    0 False True False True
    1 False False False False
    2 True False False False
    1. df.notna()
    age born name toy
    0 True False True False
    1 True True True True
    2 False True True True

    处理缺失值

    1. #删除法
    2. # pandas.DataFrame.dropna( self, axis=0, how='any',
    3. # thresh=None, subset=None, inplace=False)
    4. #axis 接收0或1。表示轴向,0为删除记录(行),1为删除特征(列)。默认为0。
    5. #how 接收特定string。表示删除的形式。any表示只要有缺失值存在就执行删除操作。all 表示当且仅当全部为缺失值时执行删除操作。默认为any。
    6. #subset 接收类array数据。表示进行去重的列∕行。默认为None,表示所有列/行。
    7. #inplace 接收boolean。表示是否在原表上进行操作。默认为False。
    1. dates = pd.date_range('20130101', periods=6)
    2. df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
    3. df.iloc[0,1] = np.nan
    4. df.iloc[1,2] = np.nan
    5. df
    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
    1. # df1接收,判断是否有缺失数据 NaN, 为 True 表示缺失数据:
    2. df1=df.isnull()
    3. 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
    1. #每一列的缺失数据 数量
    2. df2=df.isnull().sum()
    3. df2
    1. A 0
    2. B 1
    3. C 1
    4. D 0
    5. dtype: int64
    1. #整个表的缺失数据
    2. df2.sum()
    1. 2
    1. # df1接收,去掉有 NaN 的行, 可以使用 dropna 一旦出现NaN就去 除整行
    2. df3=df.dropna(axis=0,how='any')
    3. 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
    1. #替换法
    2. # 替换法是指用一个特定的值替换缺失值。
    3. # 特征可分为离散型和连续型,两者出现缺失值时的处理方法也是不同的。
    4. # 缺失值所在特征为连续型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来代替缺失值。
    5. # 缺失值所在特征为离散型时,则经常选择使用众数来替换缺失值。
    6. # pandas.DataFrame.fillna(value=None, method=None, axis=None,
    7. # inplace=False, limit=None)
    1. #value 接收scalar,dict,Series或者DataFrame。表示用来替换缺失值的值。无默认。
    2. #method 接收特定string。backfill或bfill表示使用下一个非缺失值填补缺失值。
    3. # pad或ffill表示使用上一个非缺失值填补缺失值。默认为None。
    4. #axis 接收0或1。表示轴向。默认为1。
    5. #inplace 接收boolean。表示是否在原表上进行操作。默认为False。
    6. # limit 接收int。表示填补缺失值个数上限,超过则不进行填补。默认为None。
    1. dates = pd.date_range('20130101', periods=6)
    2. df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
    3. df.iloc[0,1] = np.nan
    4. df.iloc[1,2] = np.nan
    5. df
    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
    1. # 固定值填补
    2. df2 = df.fillna(value = 0)
    3. 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
    1. # 相似值填补
    2. df3 = df.fillna(method='pad',axis=1)
    3. 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

    插值法

    1. # 删除法简单易行,但是会引起数据结构变动,样本减少;替换法使用难度较低,但是会影响数据的标准差,导致信息量变动。
    2. # 在面对数据缺失问题时,除了这两种方法之外,还有一种常用的方法—插值法。