【Python数据处理篇——DataFrame数据清洗】重复值处理、缺失值处理、特定值替换、删除指定条件行

欢迎访问我搞事情的【知乎账号】:Coffee
以及我的【B站漫威剪辑账号】:VideosMan
若我的笔记对你有帮助,请用小小的手指,点一个大大的赞哦。

关于DataFrame的相关知识,我还进行了汇总,数据清洗是DataFrame其中重要的知识点,欢迎点赞收藏!!

【Python学习笔记—保姆版】第四章—关于Pandas、数据准备、数据处理、数据分析、数据可视化


【Python数据处理篇——DataFrame数据清洗】

    • 4.3.1 数据清洗
      • 1、重复值的处理:drop_duplicates()
      • 2、缺失值处理:
        • 1. dropna() 去除数据结构中值为空的数据行
        • 2. df.fillna() 用其他数值替代NaN,有些时候空数据直接删除会影响分析的结果,可以对数据进行填补。【例4-8】使用数值或者任意字符替代缺失值
        • 3. df.fillna(method='pad') 用前一个数据值替代NaN
        • 4. df.fillna(method='bfill') 用后一个数据值替代NaN
        • 5. df.fillna(df.mean()) 用平均数或者其他描述性统计量来代替NaN。
        • 6. df.fillna(df.mean()[math: physical]) 可以选择列进行缺失值的处理
        • 7. strip():清除字符型数据左右(首尾)指定的字符,默认为空格,中间的不清除。
      • 3、特定值替换:replace('缺考', 0)
      • 4、删除满足条件元素所在的行:drop()

4.3.1 数据清洗

1、重复值的处理:drop_duplicates()

drop_duplicates()    
把数据结构中行相同的数据去除(保留其中的一行)

【例4-6】数据去重。
这里df是原始数据,其中7、9行、8、10行是重复行

 from pandas import DataFrame
 from pandas import read_excel
df = read_excel('e://rz2.xlsx')
df

Out[1]:
YHM TCSJ YWXT IP
0 S1402048 18922254812 1.225790e+17 221.205.98.55
1 S1411023 13522255003 1.225790e+17 183.184.226.205
2 S1402048 13422259938 NaN 221.205.98.55
3 20031509 18822256753 NaN 222.31.51.200
4 S1405010 18922253721 1.225790e+17 120.207.64.3
5 20140007 NaN 1.225790e+17 222.31.51.200
6 S1404095 13822254373 1.225790e+17 222.31.59.220
7 S1402048 13322252452 1.225790e+17 221.205.98.55
8 S1405011 18922257681 1.225790e+17 183.184.230.38
9 S1402048 13322252452 1.225790e+17 221.205.98.55
10 S1405011 18922257681 1.225790e+17 183.184.230.38

newDF=df.drop_duplicates()
newDF

Out[2]:
YHM TCSJ YWXT IP
0 S1402048 18922254812 1.225790e+17 221.205.98.55
1 S1411023 13522255003 1.225790e+17 183.184.226.205
2 S1402048 13422259938 NaN 221.205.98.55
3 20031509 18822256753 NaN 222.31.51.200
4 S1405010 18922253721 1.225790e+17 120.207.64.3
5 20140007 NaN 1.225790e+17 222.31.51.200
6 S1404095 13822254373 1.225790e+17 222.31.59.220
7 S1402048 13322252452 1.225790e+17 221.205.98.55
8 S1405011 18922257681 1.225790e+17 183.184.230.38

上面的df中第7和第9行数据相同,第8和第10行数据相同,去重后第7、9和8、10各保留一行数据。

2、缺失值处理:

dropna()、df.fillna() 、df.fillna(method=‘pad’)、df.fillna(method=‘bfill’)、df.fillna(df.mean())、df.fillna(df.mean()[math: physical]) 、strip()

对于缺失数据的处理方式有数据补齐、删除对应行、不处理等方法。

【例4-6】缺失处理。
这里df是原始数据,其中2、3、5行有缺失值

from pandas import DataFrame   
from pandas import read_excel   
df = read_excel('e://rz2.xlsx')    
df  

Out[1]:
YHM TCSJ YWXT IP
0 S1402048 18922254812 1.225790e+17 221.205.98.55
1 S1411023 13522255003 1.225790e+17 183.184.226.205
2 S1402048 13422259938 NaN 221.205.98.55
3 20031509 18822256753 NaN 222.31.51.200

4 S1405010 18922253721 1.225790e+17 120.207.64.3
5 20140007 NaN 1.225790e+17 222.31.51.200
6 S1404095 13822254373 1.225790e+17 222.31.59.220
7 S1402048 13322252452 1.225790e+17 221.205.98.55
8 S1405011 18922257681 1.225790e+17 183.184.230.38
9 S1402048 13322252452 1.225790e+17 221.205.98.55
10 S1405011 18922257681 1.225790e+17 183.184.230.38

1. dropna() 去除数据结构中值为空的数据行

【例4-7】删除数据为空所对应的

from pandas import DataFrame
from pandas import read_excel
df = read_excel('e://rz2.xlsx')
newDF=df.dropna()
newDF

Out[3]:
YHM TCSJ YWXT IP
0 S1402048 18922254812 1.225790e+17 221.205.98.55
1 S1411023 13522255003 1.225790e+17 183.184.226.205
4 S1405010 18922253721 1.225790e+17 120.207.64.3
6 S1404095 13822254373 1.225790e+17 222.31.59.220
7 S1402048 13322252452 1.225790e+17 221.205.98.55
8 S1405011 18922257681 1.225790e+17 183.184.230.38
9 S1402048 13322252452 1.225790e+17 221.205.98.55
10 S1405011 18922257681 1.225790e+17 183.184.230.38
例中的2、3、5行有空值NaN已经被删除

2. df.fillna() 用其他数值替代NaN,有些时候空数据直接删除会影响分析的结果,可以对数据进行填补。【例4-8】使用数值或者任意字符替代缺失值

【例4-8】使用数值或者任意字符替代缺失值

from pandas import DataFrame
from pandas import read_excel
df = read_excel('e://rz2.xlsx')
df.fillna('?')

Out[4]:
YHM TCSJ YWXT IP DLSJ
0 S1402048 1.89223e+10 1.22579e+17 221.205.98.55 2014-11-04 08:44:46
1 S1411023 1.35223e+10 1.22579e+17 183.184.226.205 2014-11-04 08:45:06
2 S1402048 1.34223e+10 ? 221.205.98.55 2014-11-04 08:46:39
3 20031509 1.88223e+10 ? 222.31.51.200 2014-11-04 08:47:41

4 S1405010 1.89223e+10 1.22579e+17 120.207.64.3 2014-11-04 08:49:03
5 20140007 ? 1.22579e+17 222.31.51.200 2014-11-04 08:50:06
6 S1404095 1.38223e+10 1.22579e+17 222.31.59.220 2014-11-04 08:50:02
7 S1402048 1.33223e+10 1.22579e+17 221.205.98.55 2014-11-04 08:49:18
8 S1405011 1.89223e+10 1.22579e+17 183.184.230.38 2014-11-04 08:14:55
9 S1402048 1.33223e+10 1.22579e+17 221.205.98.55 2014-11-04 08:49:18
10 S1405011 1.89223e+10 1.22579e+17 183.184.230.38 2014-11-04 08:14:55
如2、3、5行有空,用?替代了缺失值。

3. df.fillna(method=‘pad’) 用前一个数据值替代NaN

【例4-9】用前一个数据值替代缺失值
(2、3、5行是缺失值)

from pandas import DataFrame
from pandas import read_excel
df = read_excel('e://rz2.xlsx')
df.fillna(method='pad')

Out[5]:
YHM TCSJ YWXT IP DLSJ
0 S1402048 18922254812 1.225790e+17 221.205.98.55 2014-11-04 08:44:46
1 S1411023 13522255003 1.225790e+17 183.184.226.205 2014-11-04 08:45:06
2 S1402048 13422259938 1.225790e+17 221.205.98.55 2014-11-04 08:46:39
3 20031509 18822256753 1.225790e+17 222.31.51.200 2014-11-04 08:47:41

4 S1405010 18922253721 1.225790e+17 120.207.64.3 2014-11-04 08:49:03
5 20140007 18922253721 1.225790e+17 222.31.51.200 2014-11-04 08:50:06
6 S1404095 13822254373 1.225790e+17 222.31.59.220 2014-11-04 08:50:02
7 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
8 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
9 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
10 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55

4. df.fillna(method=‘bfill’) 用后一个数据值替代NaN

【例4-10】用后一个数据值替代NaN
(2、3、5行是缺失值)

from pandas import DataFrame
from pandas import read_excel
df = read_excel('e://rz2.xlsx')
df.fillna(method='bfill')

Out[6]:
YHM TCSJ YWXT IP DLSJ
0 S1402048 18922254812 1.225790e+17 221.205.98.55 2014-11-04 08:44:46
1 S1411023 13522255003 1.225790e+17 183.184.226.205 2014-11-04 08:45:06
2 S1402048 13422259938 1.225790e+17 221.205.98.55 2014-11-04 08:46:39
3 20031509 18822256753 1.225790e+17 222.31.51.200 2014-11-04 08:47:41

4 S1405010 18922253721 1.225790e+17 120.207.64.3 2014-11-04 08:49:03
5 20140007 13822254373 1.225790e+17 222.31.51.200 2014-11-04 08:50:06
6 S1404095 13822254373 1.225790e+17 222.31.59.220 2014-11-04 08:50:02
7 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
8 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
9 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
10 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55

5. df.fillna(df.mean()) 用平均数或者其他描述性统计量来代替NaN。

【例4-11】使用均值来填补数据。

from pandas import DataFrame
from pandas import read_excel
df = read_excel('e://rz2_0.xlsx')
df

df.fillna(df.mean())

Out[7]:
No math physical Chinese
0 1 76 85 78
1 2 85 56 NaN
2 3 76 95 85
3 4 NaN 75 58
4 5 87 52 68

Out[8]:
No math physical Chinese
0 1 76 85 78.00
1 2 85 56 72.25
2 3 76 95 85.00
3 4 81 75 58.00
4 5 87 52 68.00

6. df.fillna(df.mean()[math: physical]) 可以选择列进行缺失值的处理

【例4-12】为某列使用该列的均值来填补数据

from pandas import DataFrame
from pandas import read_excel
df = read_excel('e://rz2_0.xlsx')
df.fillna(df.mean()['math':'physical'])

Out[26]:
No math physical Chinese
0 1 76.0 85 78.0
1 2 85.0 56 NaN
2 3 76.0 95 85.0
3 4 NaN 75 58.0
4 5 87.0 52 68.0

Out[9]:
No math physical Chinese
0 1 76 85 78
1 2 85 56 NaN
2 3 76 95 85
3 4 81 75 58
4 5 87 52 68

7. strip():清除字符型数据左右(首尾)指定的字符,默认为空格,中间的不清除。

【例4-13】删除字符串左右或首位指定的字符。

from pandas import DataFrame
from pandas import read_excel
df = read_excel('e://rz2.xlsx')
newDF=df['IP'].str.strip()    #因为IP是一个对象,所以先转为str。
newDF

Out[27]:
YHM TCSJ YWXT IP DLSJ
0 S1402048 18922254812.0 1.2257903137349373e+17 221.205.98.55 2014-11-04 08:44:46
1 S1411023 13522255003.0 1.2257903137349373e+17 183.184.226.205 2014-11-04 08:45:06
2 S1402048 13422259938.0 221.205.98.55 2014-11-04 08:46:39
3 20031509 18822256753.0 222.31.51.200 2014-11-04 08:47:41
4 S1405010 18922253721.0 1.2257903137349373e+17 120.207.64.3 2014-11-04 08:49:03
5 20140007 1.2257903137349373e+17 222.31.51.200 2014-11-04 08:50:06
6 S1404095 13822254373.0 1.2257903137349373e+17 222.31.59.220 2014-11-04 08:50:02
7 S1402048 13322252452.0 1.2257903137349373e+17 221.205.98.55 2014-11-04 08:49:18
8 S1405011 18922257681.0 1.2257903137349373e+17 183.184.230.38 2014-11-04 08:14:55
9 S1402048 13322252452.0 1.2257903137349373e+17 221.205.98.55 2014-11-04 08:49:18
10 S1405011 18922257681.0 1.2257903137349373e+17 183.184.230.38 2014-11-04 08:14:55

Out[10]:
0 221.205.98.55
1 183.184.226.205
2 221.205.98.55
3 222.31.51.200
4 120.207.64.3
5 222.31.51.200
6 222.31.59.220
7 221.205.98.55
8 183.184.230.38
9 221.205.98.55
10 183.184.230.38
Name: IP, dtype: object

3、特定值替换:replace(‘缺考’, 0)

df11 = df11.replace(np.nan,'[正常]')
df11 = df11.replace('none',np.nan)
df11 = df11.replace(' ― ',np.nan)

4、删除满足条件元素所在的行:drop()

df = df.drop(df[].index)

#删除价格大于1000的手机

df_s_acc = df_s.drop(df_s[df_s['价格']>=1000].index) 

Out[68]:
Unnamed: 0 ID值 价格 … 标签 变更 规范日期
5566 6626 1354676 699 … 安全手机 2020/11/1 2020-11-01
5565 6625 1354673 799 … 安全手机 2020/11/1 2020-11-01
101 102 1346463 2699 … 安全手机 2020/11/11 2020-11-11
64 64 1338710 3199 … 安全手机 2020/11/11 2020-11-11
2884 3382 1352445 1499 … 安全手机 2020/11/26 2020-11-26
2892 3391 1349515 1099 … 安全手机 2020/11/26 2020-11-26
2910 3411 1349516 1299 … 安全手机 2020/11/26 2020-11-26

2844 3340 1348871 999 … 安全手机 2020/11/26 2020-11-26
4046 4845 1350884 799 … 安全手机 2020/12/1 2020-12-01
4036 4834 1350882 699 … 安全手机 2020/12/1 2020-12-01
3394 4023 1349976 799 … 安全手机 2020/12/12 2020-12-12
4740 5656 1353088 2399 … 安全手机 2020/12/22 2020-12-22
4737 5653 1353068 1999 … 安全手机 2020/12/22 2020-12-22
4048 4847 1357947 1099 … 安全手机 2021/1/1 2021-01-01

4038 4836 1357933 999 … 安全手机 2021/1/1 2021-01-01
4043 4842 1357949 1199 … 安全手机 2021/1/1 2021-01-01

Out[72]:
Unnamed: 0 ID值 价格 … 标签 变更 规范日期
5566 6626 1354676 699 … 安全手机 2020/11/1 2020-11-01
5565 6625 1354673 799 … 安全手机 2020/11/1 2020-11-01
2844 3340 1348871 999 … 安全手机 2020/11/26 2020-11-26
4046 4845 1350884 799 … 安全手机 2020/12/1 2020-12-01
4036 4834 1350882 699 … 安全手机 2020/12/1 2020-12-01
3394 4023 1349976 799 … 安全手机 2020/12/12 2020-12-12
4038 4836 1357933 999 … 安全手机 2021/1/1 2021-01-01

也可以使用多个条件

df_clear = df.drop(df[df['x']<0.01].index)
# 也可以使用多个条件
df_clear = df.drop(df[(df['x']<0.01) | (df['x']>10)].index) #删除x小于0.01或大于10的行

你可能感兴趣的:(python,pandas,数据分析)