天天看点

Python数据分析基础_第4节:数据清洗数据清洗

数据清洗

# 示例数据
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(10,100,(10,3)), columns=list('ABC'))
df.iloc[3:5, 0] = np.nan
df.iloc[4:6, 1] = np.nan
df.iloc[5:8, 2] = np.nan
df.head()
           
A B C
22.0 63.0 41.0
1 50.0 57.0 12.0
2 31.0 82.0 71.0
3 NaN 80.0 82.0
4 NaN NaN 49.0

缺失值

  • isnull():判断是缺失值
  • notnull():判断不是缺失值
  • fillna():缺失值填充
  • dropna():删除缺失值

缺失值判断

# 判断是否为缺失值 ,常用于筛选
df['A'].isnull()
           
0    False
1    False
2    False
3     True
4     True
5    False
6    False
7    False
8    False
9    False
Name: A, dtype: bool
           
# 判断是否为缺失值 ,常用于筛选
df['A'].notnull()
           
0     True
1     True
2     True
3    False
4    False
5     True
6     True
7     True
8     True
9     True
Name: A, dtype: bool
           
# 计算缺失值的个数
df['A'].isnull().value_counts()
           
False    8
True     2
Name: A, dtype: int64
           
# 查看所有变量非缺失值个数
df.info()
           
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   A       8 non-null      float64
 1   B       8 non-null      float64
 2   C       7 non-null      float64
dtypes: float64(3)
memory usage: 368.0 bytes
           

缺失值填充 丨★★

# 所有缺失值都填充为0,不常用。一般只针对某个变量进行填充
df.fillna(0)
           
A B C
22.0 63.0 41.0
1 50.0 57.0 12.0
2 31.0 82.0 71.0
3 0.0 80.0 82.0
4 0.0 0.0 49.0
5 44.0 0.0 0.0
6 61.0 86.0 0.0
7 25.0 17.0 0.0
8 53.0 51.0 84.0
9 44.0 36.0 54.0
# A列缺失值为空的填充为999
df['A'].fillna(999,inplace=True)
df
           
A B C
22.0 63.0 41.0
1 50.0 57.0 12.0
2 31.0 82.0 71.0
3 999.0 80.0 82.0
4 999.0 NaN 49.0
5 44.0 NaN NaN
6 61.0 86.0 NaN
7 25.0 17.0 NaN
8 53.0 51.0 84.0
9 44.0 36.0 54.0
# B列填充为平均值
df['B'].isnull().value_counts()     # 有几个缺失值  必须带()  
df['B'].mean()    # B平均值多少
           
59.0
           
# 填充缺失值
df['B'].fillna(df['B'].mean(),inplace=True)
df
           
A B C
22.0 63.0 41.0
1 50.0 57.0 12.0
2 31.0 82.0 71.0
3 999.0 80.0 82.0
4 999.0 59.0 49.0
5 44.0 59.0 NaN
6 61.0 86.0 NaN
7 25.0 17.0 NaN
8 53.0 51.0 84.0
9 44.0 36.0 54.0

缺失值删除 丨★★★

# 删除有缺失值的行,不常用。
df.dropna()    # 默认是0
           
A B C
22.0 63.0 41.0
1 50.0 57.0 12.0
2 31.0 82.0 71.0
3 999.0 80.0 82.0
4 999.0 59.0 49.0
8 53.0 51.0 84.0
9 44.0 36.0 54.0
# 删除有缺失值的列,不常用
df.dropna(axis=1)
           
A B
22.0 63.0
1 50.0 57.0
2 31.0 82.0
3 999.0 80.0
4 999.0 59.0
5 44.0 59.0
6 61.0 86.0
7 25.0 17.0
8 53.0 51.0
9 44.0 36.0
# 删除C列为缺失值的行
# df['C'].dropna(inplace=True)  错误写法,也不报错
df.dropna(subset=["C"],inplace=True)    # []不能少   ★★★
df
           
A B C
22.0 63.0 41.0
1 50.0 57.0 12.0
2 31.0 82.0 71.0
3 999.0 80.0 82.0
4 999.0 59.0 49.0
8 53.0 51.0 84.0
9 44.0 36.0 54.0
df.dropna(how="all")   # 删除全为空的行
df.dropna(thresh=2)    # 删除缺失值个数大于2的
           
A B C
22.0 63.0 41.0
1 50.0 57.0 12.0
2 31.0 82.0 71.0
3 999.0 80.0 82.0
4 999.0 59.0 49.0
8 53.0 51.0 84.0
9 44.0 36.0 54.0

重复值

# 示例数据
import pandas as pd
import numpy as np
np.random.seed(10)  # 确保每次生成的随机数都是一样的
df = pd.DataFrame(np.random.randint(80,100,(10,3)),columns=['A','B','C'])
df
           
A B C
89 84 95
1 80 97 96
2 97 88 89
3 80 90 88
4 84 99 96
5 84 95 91
6 91 81 88
7 84 94 97
8 99 93 85
9 93 99 93

重复值判断 丨★★

# 筛选重复数据,
df[df.duplicated(subset='A',keep=False)]    # False(都不删除)  'first'(删除第一条)  'last'(删除最后第一条)
           
A B C
1 80 97 96
3 80 90 88
4 84 99 96
5 84 95 91
7 84 94 97
# 判断重复值,第一次出现的为False
df['A'].duplicated()
           
0    False
1    False
2    False
3     True
4    False
5     True
6    False
7     True
8    False
9    False
Name: A, dtype: bool
           
# 去掉重复值
df['A'].unique()   
           
array([89, 80, 97, 84, 91, 99, 93])
           

重复值删除 丨★★★

# 一个字段判断
df.drop_duplicates('A',inplace=True)
df
           
A B C
89 84 95
1 80 97 96
2 97 88 89
4 84 99 96
6 91 81 88
8 99 93 85
9 93 99 93
# 多个字段判的
df.drop_duplicates(subset=['A','B'],keep='first',inplace=True)
df
           
A B C
89 84 95
1 80 97 96
2 97 88 89
4 84 99 96
6 91 81 88
8 99 93 85
9 93 99 93

数据替换

# 示例数据
import pandas as pd
grades = [48, 99, 75, 80, 42, 80, 72, 68, 36, 78]
df = pd.DataFrame({'ID': ["N2000%d" % r for r in range(10)],
                    '性别': ['F', 'M', 'F', 'M', 'F','M', 'F', 'M', 'M', 'M'],
                    '考试年份': ['2007', '2007', '2007', '2008', '2008', '2008', '2008', '2009', '2009', '2009'],
                    '科目': ['代数', '统计', '生物', '代数','代数', '统计', '统计', '代数','生物', '生物'],
                    '是否参加': ['yes', 'yes', 'yes', 'yes', 'no','yes', 'yes', 'yes', 'yes', 'yes'],
                     '是否通过': ['yes' if x > 50 else 'no' for x in grades],
                     '是否录用': [True, True, True, False,False, False, False, True, True, False],
                     '得分': grades})
df
           
ID 性别 考试年份 科目 是否参加 是否通过 是否录用 得分
N20000 F 2007 代数 yes no True 48
1 N20001 M 2007 统计 yes yes True 99
2 N20002 F 2007 生物 yes yes True 75
3 N20003 M 2008 代数 yes yes False 80
4 N20004 F 2008 代数 no no False 42
5 N20005 M 2008 统计 yes yes False 80
6 N20006 F 2008 统计 yes yes False 72
7 N20007 M 2009 代数 yes yes True 68
8 N20008 M 2009 生物 yes no True 36
9 N20009 M 2009 生物 yes yes False 78

一对一或者多对一替换 丨★★★

df['科目'].replace(['代数','统计'],'数学',inplace=True)
df
           
ID 性别 考试年份 科目 是否参加 是否通过 是否录用 得分
N20000 F 2007 数学 yes no True 48
1 N20001 M 2007 数学 yes yes True 99
2 N20002 F 2007 生物 yes yes True 75
3 N20003 M 2008 数学 yes yes False 80
4 N20004 F 2008 数学 no no False 42
5 N20005 M 2008 数学 yes yes False 80
6 N20006 F 2008 数学 yes yes False 72
7 N20007 M 2009 数学 yes yes True 68
8 N20008 M 2009 生物 yes no True 36
9 N20009 M 2009 生物 yes yes False 78

多对多替换 丨★★★

df['是否参加'].replace(['yes','no'],['是','否'],inplace=True)
df
           
ID 性别 考试年份 科目 是否参加 是否通过 是否录用 得分
N20000 F 2007 数学 no True 48
1 N20001 M 2007 数学 yes True 99
2 N20002 F 2007 生物 yes True 75
3 N20003 M 2008 数学 yes False 80
4 N20004 F 2008 数学 no False 42
5 N20005 M 2008 数学 yes False 80
6 N20006 F 2008 数学 yes False 72
7 N20007 M 2009 数学 yes True 68
8 N20008 M 2009 生物 no True 36
9 N20009 M 2009 生物 yes False 78

map丨★★★

df['性别'] = df['性别'].map(lambda x: 'F' if x==1 else 'M')
df
           
ID 性别 考试年份 科目 是否参加 是否通过 是否录用 得分
N20000 M 2007 数学 no True 48
1 N20001 M 2007 数学 yes True 99
2 N20002 M 2007 生物 yes True 75
3 N20003 M 2008 数学 yes False 80
4 N20004 M 2008 数学 no False 42
5 N20005 M 2008 数学 yes False 80
6 N20006 M 2008 数学 yes False 72
7 N20007 M 2009 数学 yes True 68
8 N20008 M 2009 生物 no True 36
9 N20009 M 2009 生物 yes False 78

loc原地替换 丨★

df.loc[df['是否通过']=='yes', '是否通过'] = '是'
df.loc[df['是否通过']=='no', '是否通过'] = '否'
df
           
ID 性别 考试年份 科目 是否参加 是否通过 是否录用 得分
N20000 M 2007 数学 True 48
1 N20001 M 2007 数学 True 99
2 N20002 M 2007 生物 True 75
3 N20003 M 2008 数学 False 80
4 N20004 M 2008 数学 False 42
5 N20005 M 2008 数学 False 80
6 N20006 M 2008 数学 False 72
7 N20007 M 2009 数学 True 68
8 N20008 M 2009 生物 True 36
9 N20009 M 2009 生物 False 78

字典方式替换

df['性别'].replace({'F':1, 'M':0},inplace=True)
df
           
ID 性别 考试年份 科目 是否参加 是否通过 是否录用 得分
N20000 2007 数学 True 48
1 N20001 2007 数学 True 99
2 N20002 2007 生物 True 75
3 N20003 2008 数学 False 80
4 N20004 2008 数学 False 42
5 N20005 2008 数学 False 80
6 N20006 2008 数学 False 72
7 N20007 2009 数学 True 68
8 N20008 2009 生物 True 36
9 N20009 2009 生物 False 78

字符串处理

字符串拆分 丨str.split() 丨★★★

# 示例数据
import pandas as pd
import numpy as np

s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'])
s3 = s2.str.split('_')   # ★★★
s3
           
0    [a, b, c]
1    [c, d, e]
2          NaN
3    [f, g, h]
dtype: object
           
0      b
1      d
2    NaN
3      g
dtype: object
           
0      b
1      d
2    NaN
3      g
dtype: object
           
1 2
a b c
1 c d e
2 NaN NaN NaN
3 f g h
1
a b_c
1 c d_e
2 NaN NaN
3 f g_h

去除空格 丨str.strip() 丨★★★

# 示例数据
s1 = pd.Series([' jack', 'jill ', ' jesse ', 'frank'])
s1
           
0       jack
1      jill 
2     jesse 
3      frank
dtype: object
           
# 除去左右两侧空格,中间的空格不变
s1.str.strip()
           
0     jack
1     jill
2    jesse
3    frank
dtype: object
           
# 除去左侧空格
s1.str.lstrip()
           
0      jack
1     jill 
2    jesse 
3     frank
dtype: object
           
# 除去右侧空格
s1.str.rstrip()
           
0      jack
1      jill
2     jesse
3     frank
dtype: object
           
# 示例数据
df = pd.DataFrame(np.random.randn(3, 2),columns=[' Column A ', ' Column B '], index=range(3))
df
           
Column A Column B
-1.254242 0.331579
1 -0.308600 -0.153735
2 0.678931 -1.913554
df.columns = df.columns.str.strip().str.lower().str.replace(' ', '_')   # 注意三个str
df
           
column_a column_b
-1.254242 0.331579
1 -0.308600 -0.153735
2 0.678931 -1.913554

转换成小写 丨str.lower()

0       jack
1      jill 
2     jesse 
3      frank
dtype: object
           

转换成大写 丨str.upper()

0       JACK
1      JILL 
2     JESSE 
3      FRANK
dtype: object
           

格式化

name = '张三'
area = '中国'
weight = 60
height = 170
           
# %方式
print('姓名%s,来自%s,体重%i,身高%i' %(name,area,weight,height))
print('姓名%s,来自%s,体重%.2f,身高%.2f' %(name,area,weight,height))
           
姓名张三,来自中国,体重60,身高170
姓名张三,来自中国,体重60.00,身高170.00
           

删除行列

# 示例数据
import pandas as pd
import numpy as np
df =  pd.DataFrame(np.random.normal(10,2,(4,4)),columns=['A','B','C','D'])
df
           
A B C D
8.115084 6.508914 7.958109 9.675862
1 8.684058 10.844226 11.248047 11.003280
2 11.682869 6.719500 12.116010 9.816431
3 8.551931 9.199079 10.890649 11.919879
# 删除A列,但不改变源数据
df.drop('A',axis=1)
           
B C D
6.508914 7.958109 9.675862
1 10.844226 11.248047 11.003280
2 6.719500 12.116010 9.816431
3 9.199079 10.890649 11.919879
# 删除A列,且改变源数据
df.drop('A',axis=1,inplace=True)
           
# 删除所有为1的行,axis=0 可不写 ,当删除多行是用列表
df.drop(1)   
           
B C D
6.508914 7.958109 9.675862
2 6.719500 12.116010 9.816431
3 9.199079 10.890649 11.919879

更改列名 丨★★★

# 示例数据
import pandas as pd
import numpy as np
df =  pd.DataFrame(np.random.normal(10,2,(4,4)),columns=['A','B','C','D'])
df
           
A B C D
7.307292 14.037799 12.164753 6.428564
1 9.455326 9.419263 13.312294 7.530863
2 7.884631 10.276828 9.828200 9.727539
3 7.725770 11.276272 9.016792 7.507430
# 方法1:
df.columns= ['a','b','c','d']  # 列名的个数 = 字段个数
df
           
a b c d
7.307292 14.037799 12.164753 6.428564
1 9.455326 9.419263 13.312294 7.530863
2 7.884631 10.276828 9.828200 9.727539
3 7.725770 11.276272 9.016792 7.507430
# 方法2:字典,可单个修改
df.rename(columns = {'a':'aa'},inplace=True)   # columns不能少  ★★★
df
           
aa b c d
7.307292 14.037799 12.164753 6.428564
1 9.455326 9.419263 13.312294 7.530863
2 7.884631 10.276828 9.828200 9.727539
3 7.725770 11.276272 9.016792 7.507430

改变列的格式 丨★★

# 示例数据
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(5,3),columns=['A','B','C'])
df
           
A B C
0.224873 0.114649 0.583017
1 0.232641 0.556518 0.523811
2 0.350958 0.705332 0.820704
3 0.134563 0.604726 0.283148
4 0.506408 0.038460 0.332444
# A列转未字符串
df['A'] = df['A'].astype('str')
df.dtypes
           
A     object
B    float64
C    float64
dtype: object
           
# 字符串相加
df['A'].sum()
           
'0.224872802469813340.232641062735879140.3509582237713720.134563003464316160.5064078198775632'
           
# 数值求和
df['B'].sum()
           
2.01968518853518
           
df['B%'] = df['B'].apply(lambda x: '%.2f%%' % (x*100))
df
           
A B C B%
0.22487280246981334 0.114649 0.583017 11.46%
1 0.23264106273587914 0.556518 0.523811 55.65%
2 0.350958223771372 0.705332 0.820704 70.53%
3 0.13456300346431616 0.604726 0.283148 60.47%
4 0.5064078198775632 0.038460 0.332444 3.85%

索引

设置索引丨set_index() 丨★

# 模拟数据
from faker import Faker
fake=Faker(locale='zh_CN')
Faker.seed(10000)   # 每次随机数不变

import pandas as pd
import numpy as np
import random
random.seed(10000)   # 每次随机数不变

data = pd.DataFrame()
for i in range(100):
    datai = pd.DataFrame({'编号': "N2020_%d" % (i),
                          '姓名':fake.name(),
                          '性别':np.random.choice(['男','女']),
                          '省份':fake.province(),
                          '公司':fake.company(),
                          '身份证号':fake.ssn(),
                          '邮箱':fake.safe_email(),
                          '手机号':fake.phone_number(),
                          '年龄':np.random.randint(30,50,1),
                          '完成率':np.random.random(),
                          '日期':fake.date_time(),
                         '销售':fake.numerify()},
                         index = [i])
    data = data.append(datai)
data.head()
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
N2020_0 范金凤 四川省 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 33 0.377441 2009-06-28 16:36:39 488
1 N2020_1 李平 北京市 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 43 0.064251 2009-11-25 07:11:24 616
2 N2020_2 李林 福建省 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 43 0.495049 1992-05-08 23:04:30 835
3 N2020_3 王玉华 台湾省 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 35 0.340037 1990-02-22 12:35:34 589
4 N2020_4 赵平 天津市 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 41 0.578136 2013-12-02 20:31:27 922
data1 = data.set_index('省份')
data1.head()
           
编号 姓名 性别 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
省份
四川省 N2020_0 范金凤 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 33 0.377441 2009-06-28 16:36:39 488
北京市 N2020_1 李平 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 43 0.064251 2009-11-25 07:11:24 616
福建省 N2020_2 李林 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 43 0.495049 1992-05-08 23:04:30 835
台湾省 N2020_3 王玉华 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 35 0.340037 1990-02-22 12:35:34 589
天津市 N2020_4 赵平 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 41 0.578136 2013-12-02 20:31:27 922
data2  = data.set_index(['省份','姓名'])
data2.head()
           
编号 性别 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
省份 姓名
四川省 范金凤 N2020_0 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 33 0.377441 2009-06-28 16:36:39 488
北京市 李平 N2020_1 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 43 0.064251 2009-11-25 07:11:24 616
福建省 李林 N2020_2 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 43 0.495049 1992-05-08 23:04:30 835
台湾省 王玉华 N2020_3 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 35 0.340037 1990-02-22 12:35:34 589
天津市 赵平 N2020_4 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 41 0.578136 2013-12-02 20:31:27 922

重置索引丨reset_index() 丨★

省份 编号 姓名 性别 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
四川省 N2020_0 范金凤 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 33 0.377441 2009-06-28 16:36:39 488
1 北京市 N2020_1 李平 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 43 0.064251 2009-11-25 07:11:24 616
2 福建省 N2020_2 李林 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 43 0.495049 1992-05-08 23:04:30 835
3 台湾省 N2020_3 王玉华 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 35 0.340037 1990-02-22 12:35:34 589
4 天津市 N2020_4 赵平 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 41 0.578136 2013-12-02 20:31:27 922
姓名 编号 性别 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
省份
四川省 范金凤 N2020_0 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 33 0.377441 2009-06-28 16:36:39 488
北京市 李平 N2020_1 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 43 0.064251 2009-11-25 07:11:24 616
福建省 李林 N2020_2 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 43 0.495049 1992-05-08 23:04:30 835
台湾省 王玉华 N2020_3 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 35 0.340037 1990-02-22 12:35:34 589
天津市 赵平 N2020_4 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 41 0.578136 2013-12-02 20:31:27 922

更新索引丨reindex() 丨★

data3 = data.head()
data3
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
N2020_0 范金凤 四川省 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 33 0.377441 2009-06-28 16:36:39 488
1 N2020_1 李平 北京市 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 43 0.064251 2009-11-25 07:11:24 616
2 N2020_2 李林 福建省 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 43 0.495049 1992-05-08 23:04:30 835
3 N2020_3 王玉华 台湾省 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 35 0.340037 1990-02-22 12:35:34 589
4 N2020_4 赵平 天津市 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 41 0.578136 2013-12-02 20:31:27 922
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
2 N2020_2 李林 福建省 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 43 0.495049 1992-05-08 23:04:30 835
3 N2020_3 王玉华 台湾省 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 35 0.340037 1990-02-22 12:35:34 589
N2020_0 范金凤 四川省 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 33 0.377441 2009-06-28 16:36:39 488
1 N2020_1 李平 北京市 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 43 0.064251 2009-11-25 07:11:24 616
4 N2020_4 赵平 天津市 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 41 0.578136 2013-12-02 20:31:27 922

索引排序丨sort_index()

编号 姓名 性别 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
省份
黑龙江省 N2020_75 刘鑫 超艺传媒有限公司 210701194711181795 [email protected] 13228202589 47 0.974812 1974-12-29 11:36:42 155
黑龙江省 N2020_55 蒋文 惠派国际公司信息有限公司 52272619661221162X [email protected] 18636530837 42 0.304991 1971-10-22 00:37:03 259
黑龙江省 N2020_18 郑敏 彩虹信息有限公司 410200194702267611 [email protected] 15646946384 46 0.381412 1997-04-21 04:29:16 132
香港特别行政区 N2020_39 高洁 商软冠联信息有限公司 50011519990112238X [email protected] 13209584706 34 0.017030 1999-07-18 21:25:45 699
香港特别行政区 N2020_19 梁雪 银嘉科技有限公司 330825197106213864 [email protected] 13488583474 38 0.925357 1981-10-04 09:20:40 994
编号 性别 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
省份 姓名
台湾省 黄燕 N2020_87 易动力传媒有限公司 370829199012030735 [email protected] 13242323364 31 0.471365 1985-08-17 18:52:10 408
西藏自治区 黄峰 N2020_13 良诺科技有限公司 510801193903095981 [email protected] 15660156361 36 0.986889 2016-03-23 15:45:29 291
宁夏回族自治区 黄丽丽 N2020_11 华远软件传媒有限公司 510114196409150161 [email protected] 18137834227 37 0.885827 1987-08-14 18:46:45 382
香港特别行政区 高洁 N2020_39 商软冠联信息有限公司 50011519990112238X [email protected] 13209584706 34 0.017030 1999-07-18 21:25:45 699
江苏省 马彬 N2020_45 凌云信息有限公司 36073319691231944X [email protected] 13578076912 43 0.573776 1990-01-29 02:45:42 160
编号 性别 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
省份 姓名
黑龙江省 郑敏 N2020_18 彩虹信息有限公司 410200194702267611 [email protected] 15646946384 46 0.381412 1997-04-21 04:29:16 132
蒋文 N2020_55 惠派国际公司信息有限公司 52272619661221162X [email protected] 18636530837 42 0.304991 1971-10-22 00:37:03 259
刘鑫 N2020_75 超艺传媒有限公司 210701194711181795 [email protected] 13228202589 47 0.974812 1974-12-29 11:36:42 155
香港特别行政区 高洁 N2020_39 商软冠联信息有限公司 50011519990112238X [email protected] 13209584706 34 0.017030 1999-07-18 21:25:45 699
梁雪 N2020_19 银嘉科技有限公司 330825197106213864 [email protected] 13488583474 38 0.925357 1981-10-04 09:20:40 994

数据筛选

# 模拟数据
from faker import Faker
fake=Faker(locale='zh_CN')
Faker.seed(10000)   # 每次随机数不变

import pandas as pd
import numpy as np
import random
random.seed(10000)   # 每次随机数不变

data = pd.DataFrame()
for i in range(100):
    datai = pd.DataFrame({'编号': "N2020_%d" % (i),
                          '姓名':fake.name(),
                          '性别':np.random.choice(['男','女']),
                          '省份':fake.province(),
                          '公司':fake.company(),
                          '身份证号':fake.ssn(),
                          '邮箱':fake.safe_email(),
                          '手机号':fake.phone_number(),
                          '年龄':np.random.randint(30,50,1),
                          '完成率':np.random.random(),
                          '日期':fake.date_time(),
                         '销售':fake.numerify()},
                         index = [i])
    data = data.append(datai)
data.head()
data.to_excel('C:/Users/users/Desktop/Python课件/课件编写/data/p4_数据清洗2.xlsx')
           

筛选列 丨★★

# 筛选1列
data['姓名'].head(10)
           
0    范金凤
1     李平
2     李林
3    王玉华
4     赵平
5    陈桂花
6     韦亮
7     钟瑜
8    刘桂花
9    刘桂花
Name: 姓名, dtype: object
           
# 筛选多列,也可以作为排序用 双中括号  ★★
data[['姓名', '省份']].head(10)
           
姓名 省份
范金凤 四川省
1 李平 北京市
2 李林 福建省
3 王玉华 台湾省
4 赵平 天津市
5 陈桂花 河南省
6 韦亮 福建省
7 钟瑜 新疆维吾尔自治区
8 刘桂花 山东省
9 刘桂花 辽宁省

筛选行

# 1个条件筛选
data[data['省份']=='北京市']
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
1 N2020_1 李平 北京市 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 46 0.057950 2009-11-25 07:11:24 616
23 N2020_23 李慧 北京市 巨奥信息有限公司 450223196310134685 [email protected] 18597786292 34 0.710752 1971-10-30 04:34:58 785
# 多条件筛选
data[(data['性别']=='男')&(data['省份']=='四川省')]
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
29 N2020_29 温云 四川省 创汇传媒有限公司 411621195006187174 [email protected] 15764016109 30 0.037330 1995-07-27 08:30:33 005
52 N2020_52 陈秀梅 四川省 艾提科信科技有限公司 621022196409096901 [email protected] 18797029868 36 0.735764 2014-02-16 02:19:28 005
56 N2020_56 徐艳 四川省 超艺网络有限公司 230404195602088429 [email protected] 15730053639 36 0.285640 1977-07-27 07:27:07 782
71 N2020_71 韩凤英 四川省 网新恒天网络有限公司 152202194306033785 [email protected] 13699762247 39 0.089812 2019-06-26 04:44:02 760

根据内容精确匹配丨isin() 丨★★

# isin()
data[data['省份'].isin(['山东省','四川省'])].head()
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
N2020_0 范金凤 四川省 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 41 0.700930 2009-06-28 16:36:39 488
8 N2020_8 刘桂花 山东省 恩悌网络有限公司 230184197702140647 [email protected] 13310655117 34 0.516789 2015-09-29 16:21:28 439
29 N2020_29 温云 四川省 创汇传媒有限公司 411621195006187174 [email protected] 15764016109 30 0.037330 1995-07-27 08:30:33 005
35 N2020_35 宋楠 山东省 恒聪百汇网络有限公司 370213199602238217 [email protected] 13027921428 47 0.253179 1980-10-16 17:48:44 451
52 N2020_52 陈秀梅 四川省 艾提科信科技有限公司 621022196409096901 [email protected] 18797029868 36 0.735764 2014-02-16 02:19:28 005
# isin()
data[data['年龄'].isin([35,36,38])].head()
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
4 N2020_4 赵平 天津市 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 38 0.160348 2013-12-02 20:31:27 922
5 N2020_5 陈桂花 河南省 华泰通安科技有限公司 51343219440729157X [email protected] 15115129137 35 0.176635 2011-04-05 20:09:54 006
6 N2020_6 韦亮 福建省 合联电子科技有限公司 610730195403213354 [email protected] 13680169513 36 0.713555 1988-09-08 02:15:10 769
7 N2020_7 钟瑜 新疆维吾尔自治区 浙大万朋传媒有限公司 632823199206261862 [email protected] 15636503787 35 0.615502 2010-03-08 11:00:32 435
10 N2020_10 林秀兰 吉林省 恩悌科技有限公司 532524196805192224 [email protected] 14522841055 38 0.535469 1970-02-01 06:55:39 602

根据内容模糊匹配丨str.contains() 丨★★

# str.contains()
data[data['公司'].str.contains('动力')].head()
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
21 N2020_21 方琳 青海省 易动力网络有限公司 130481196911267803 [email protected] 14509729550 32 0.754724 2017-12-27 19:42:26 277
37 N2020_37 王梅 辽宁省 易动力科技有限公司 370812194801193481 [email protected] 18574736528 46 0.706331 1972-03-16 17:56:14 810
62 N2020_62 陈梅 四川省 易动力网络有限公司 341126199909224292 [email protected] 13818527086 34 0.969633 1970-02-04 14:33:40 411
87 N2020_87 黄燕 台湾省 易动力传媒有限公司 370829199012030735 [email protected] 13242323364 44 0.975404 1985-08-17 18:52:10 408
94 N2020_94 余建 西藏自治区 易动力网络有限公司 500120197803071859 [email protected] 13304313249 32 0.055106 2008-05-29 04:44:57 194
# str.contains()
data[data['公司'].str.contains('计算机|动力')].head()
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
21 N2020_21 方琳 青海省 易动力网络有限公司 130481196911267803 [email protected] 14509729550 32 0.754724 2017-12-27 19:42:26 277
37 N2020_37 王梅 辽宁省 易动力科技有限公司 370812194801193481 [email protected] 18574736528 46 0.706331 1972-03-16 17:56:14 810
62 N2020_62 陈梅 四川省 易动力网络有限公司 341126199909224292 [email protected] 13818527086 34 0.969633 1970-02-04 14:33:40 411
70 N2020_70 徐涛 四川省 晖来计算机信息有限公司 441201195906202227 [email protected] 13422409521 36 0.353785 1994-04-02 12:23:33 743
87 N2020_87 黄燕 台湾省 易动力传媒有限公司 370829199012030735 [email protected] 13242323364 44 0.975404 1985-08-17 18:52:10 408

根据字符串长度 丨str.len()

0    5
1    5
2    7
3    5
dtype: int64
           

根据字符串形式 丨str.is*() 丨★★★

# 示例数据
df = pd.DataFrame({'值':['HELLO','world','China','Python',' ','10',100,'字符串','data',np.nan]})
df
           
HELLO
1 world
2 China
3 Python
4
5 10
6 100
7 字符串
8 data
9 NaN
# #所有字符都是数字或者字母
df['字符串数值或者字母'] = df['值'].str.isalnum() 
df
           
字符串数值或者字母
HELLO True
1 world True
2 China True
3 Python True
4 False
5 10 True
6 100 NaN
7 字符串 True
8 data True
9 NaN NaN
#所有字符都是字母  
df['字母'] = df['值'].str.isalpha()
df
           
字符串数值或者字母 字母
HELLO True True
1 world True True
2 China True True
3 Python True True
4 False False
5 10 True False
6 100 NaN NaN
7 字符串 True True
8 data True True
9 NaN NaN NaN
#所有字符都是数字  
df['字符串数字'] = df['值'].str.isdigit() 
df
           
字符串数值或者字母 字母 字符串数字
HELLO True True False
1 world True True False
2 China True True False
3 Python True True False
4 False False False
5 10 True False True
6 100 NaN NaN NaN
7 字符串 True True False
8 data True True False
9 NaN NaN NaN NaN
# 所有字符都是小写
df['小写字母'] = df['值'].str.islower() 
df
           
字符串数值或者字母 字母 字符串数字 小写字母
HELLO True True False False
1 world True True False True
2 China True True False False
3 Python True True False False
4 False False False False
5 10 True False True False
6 100 NaN NaN NaN NaN
7 字符串 True True False False
8 data True True False True
9 NaN NaN NaN NaN NaN
# 所有字符都为大写
df['大写字母'] = df['值'].str.isupper() 
df
           
字符串数值或者字母 字母 字符串数字 小写字母 大写字母
HELLO True True False False True
1 world True True False True False
2 China True True False False False
3 Python True True False False False
4 False False False False False
5 10 True False True False False
6 100 NaN NaN NaN NaN NaN
7 字符串 True True False False False
8 data True True False True False
9 NaN NaN NaN NaN NaN NaN
# 所有单词都是首字母大写
df['首字母大写'] = df['值'].str.istitle() 
df
           
字符串数值或者字母 字母 字符串数字 小写字母 大写字母 首字母大写
HELLO True True False False True False
1 world True True False True False False
2 China True True False False False True
3 Python True True False False False True
4 False False False False False False
5 10 True False True False False False
6 100 NaN NaN NaN NaN NaN NaN
7 字符串 True True False False False False
8 data True True False True False False
9 NaN NaN NaN NaN NaN NaN NaN
# 所有字符都是空白字
df['空格'] = df['值'].str.isspace() 
df
           
字符串数值或者字母 字母 字符串数字 小写字母 大写字母 首字母大写 空格
HELLO True True False False True False False
1 world True True False True False False False
2 China True True False False False True False
3 Python True True False False False True False
4 False False False False False False True
5 10 True False True False False False False
6 100 NaN NaN NaN NaN NaN NaN NaN
7 字符串 True True False False False False False
8 data True True False True False False False
9 NaN NaN NaN NaN NaN NaN NaN NaN

分组后筛选丨groupby() 丨★★

# 分组后筛选每组第1个
data.sort_values(by='年龄').groupby('省份',as_index=False).first().head()
           
省份 编号 姓名 性别 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
上海市 N2020_73 卢丹 盟新科技有限公司 370202194101232333 [email protected] 15682747497 35 0.691084 2019-10-02 12:23:51 761
1 云南省 N2020_97 陈帅 商软冠联网络有限公司 46902319400324717X [email protected] 14529122727 37 0.635785 2007-05-29 09:35:04 564
2 内蒙古自治区 N2020_47 谭利 时刻网络有限公司 140321194101147472 [email protected] 13363990254 32 0.910402 2011-11-03 00:34:49 373
3 北京市 N2020_23 李慧 巨奥信息有限公司 450223196310134685 [email protected] 18597786292 34 0.710752 1971-10-30 04:34:58 785
4 台湾省 N2020_61 曹凯 南康科技有限公司 150502196806098191 [email protected] 13262601832 31 0.622077 1983-02-03 04:28:03 913
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
4 87 N2020_87 黄燕 台湾省 易动力传媒有限公司 370829199012030735 [email protected] 13242323364 44 0.975404 1985-08-17 18:52:10 408
5 33 N2020_33 冯璐 吉林省 太极科技有限公司 411381195107138515 [email protected] 13982410034 31 0.981835 2017-07-01 01:55:38 507
6 62 N2020_62 陈梅 四川省 易动力网络有限公司 341126199909224292 [email protected] 13818527086 34 0.969633 1970-02-04 14:33:40 411
9 51 N2020_51 李伟 安徽省 商软冠联网络有限公司 530701193409160440 [email protected] 15322916084 34 0.982004 2006-04-29 07:34:08 977
15 96 N2020_96 李淑华 江西省 襄樊地球村信息有限公司 542431194904214928 [email protected] 13447067886 31 0.966989 1977-11-06 19:40:07 529

loc()

编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
N2020_0 范金凤 四川省 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 41 0.700930 2009-06-28 16:36:39 488
29 N2020_29 温云 四川省 创汇传媒有限公司 411621195006187174 [email protected] 15764016109 30 0.037330 1995-07-27 08:30:33 005
52 N2020_52 陈秀梅 四川省 艾提科信科技有限公司 621022196409096901 [email protected] 18797029868 36 0.735764 2014-02-16 02:19:28 005
56 N2020_56 徐艳 四川省 超艺网络有限公司 230404195602088429 [email protected] 15730053639 36 0.285640 1977-07-27 07:27:07 782
62 N2020_62 陈梅 四川省 易动力网络有限公司 341126199909224292 [email protected] 13818527086 34 0.969633 1970-02-04 14:33:40 411
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
N2020_0 范金凤 四川省 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 41 0.700930 2009-06-28 16:36:39 488
1 N2020_1 李平 北京市 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 46 0.057950 2009-11-25 07:11:24 616
3 N2020_3 王玉华 台湾省 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 49 0.449515 1990-02-22 12:35:34 589
4 N2020_4 赵平 天津市 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 38 0.160348 2013-12-02 20:31:27 922
6 N2020_6 韦亮 福建省 合联电子科技有限公司 610730195403213354 [email protected] 13680169513 36 0.713555 1988-09-08 02:15:10 769
姓名 销售
范金凤 488
1 李平 616
3 王玉华 589
4 赵平 922
6 韦亮 769

iloc()

编号 姓名 性别
2 N2020_2 李林
3 N2020_3 王玉华
5 N2020_5 陈桂花
编号 姓名 性别
2 N2020_2 李林
3 N2020_3 王玉华
4 N2020_4 赵平
5 N2020_5 陈桂花
6 N2020_6 韦亮
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
2 N2020_2 李林 福建省 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 31 0.648331 1992-05-08 23:04:30 835
3 N2020_3 王玉华 台湾省 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 49 0.449515 1990-02-22 12:35:34 589
5 N2020_5 陈桂花 河南省 华泰通安科技有限公司 51343219440729157X [email protected] 15115129137 35 0.176635 2011-04-05 20:09:54 006

数据排序

# 示例数据
import pandas as pd
import numpy as np
df = pd.DataFrame({'animal': 'cat dog cat fish dog cat cat'.split(),
                   'size': list('SSMMMLL'),
                   'weight': [8, 10, 11, 1, 20, 12, 12],
                   'adult': [False] * 5 + [True] * 2})
df
           
animal size weight adult
cat S 8 False
1 dog S 10 False
2 cat M 11 False
3 fish M 1 False
4 dog M 20 False
5 cat L 12 True
6 cat L 12 True

单个字段排序

df.sort_values('animal')  # 默认升序
df.sort_values('animal',ascending=False)  # 默认升序
           
animal size weight adult
3 fish M 1 False
1 dog S 10 False
4 dog M 20 False
cat S 8 False
2 cat M 11 False
5 cat L 12 True
6 cat L 12 True

多个字段排序

df.sort_values(['animal','weight'],ascending=[True,False])
df.sort_values(['animal','weight'],ascending=False).head()
           
animal size weight adult
3 fish M 1 False
4 dog M 20 False
1 dog S 10 False
5 cat L 12 True
6 cat L 12 True

日期数据

生成日期序列

# pd.date_range()  时间戳
import pandas as pd
dt1= pd.date_range('2018-01-01', periods=10, freq='D')
dt1
           
DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
               '2018-01-05', '2018-01-06', '2018-01-07', '2018-01-08',
               '2018-01-09', '2018-01-10'],
              dtype='datetime64[ns]', freq='D')
           
# pd.period_range()  时间周期
dt2 = pd.period_range('1/1/2018', freq='D', periods=10)
dt2
           
PeriodIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
             '2018-01-05', '2018-01-06', '2018-01-07', '2018-01-08',
             '2018-01-09', '2018-01-10'],
            dtype='period[D]', freq='D')
           

设置为日期格式丨★★★

# 示例数据
import pandas as pd
import numpy as np
df = pd.DataFrame({'日期':['2020-3-1%i'% i for i in range(10)],
                  '值':np.random.randint(80,100,10)})
df.head()
           
日期
2020-3-10 82
1 2020-3-11 92
2 2020-3-12 89
3 2020-3-13 83
4 2020-3-14 87
df.dtypes
           
日期    object
值      int32
dtype: object
           
# 方式1
df['日期_to_datetime'] = pd.to_datetime(df['日期'])  
# errors='ignore'无法转换时显示原始值,结果格式不变
# errors = 'coerce':无法转换时,返回错误值,结果为时间格式
df
           
日期 日期_to_datetime
2020-3-10 82 2020-03-10
1 2020-3-11 92 2020-03-11
2 2020-3-12 89 2020-03-12
3 2020-3-13 83 2020-03-13
4 2020-3-14 87 2020-03-14
5 2020-3-15 89 2020-03-15
6 2020-3-16 92 2020-03-16
7 2020-3-17 85 2020-03-17
8 2020-3-18 87 2020-03-18
9 2020-3-19 88 2020-03-19
# 方式2
from datetime import datetime
df['日期_strptime'] = [datetime.strptime(x,'%Y-%m-%d') for x in df['日期']] 
df['日期_strptime1'] = df['日期'].apply(lambda x: datetime.strptime(x,'%Y-%m-%d')) 
df.head()
           
日期 日期_to_datetime 日期_strptime 日期_strptime1
2020-3-10 82 2020-03-10 2020-03-10 2020-03-10
1 2020-3-11 92 2020-03-11 2020-03-11 2020-03-11
2 2020-3-12 89 2020-03-12 2020-03-12 2020-03-12
3 2020-3-13 83 2020-03-13 2020-03-13 2020-03-13
4 2020-3-14 87 2020-03-14 2020-03-14 2020-03-14
df.dtypes
           
日期                        object
值                          int32
日期_to_datetime    datetime64[ns]
日期_strptime       datetime64[ns]
日期_strptime1      datetime64[ns]
dtype: object
           

计算日期间隔

# 模拟数据
from faker import Faker
fake=Faker(locale='zh_CN')
Faker.seed(10000)   # 每次随机数不变

import pandas as pd
import numpy as np
np.random.seed(10000)   # 每次随机数不变

data = pd.DataFrame()
for i in range(10):
    datai = pd.DataFrame({'日期1': fake.date_time(),
                          '日期2':fake.date_time()},
                         index = [i])
    data = data.append(datai)
data.head()
           
日期1 日期2
2009-04-30 04:12:39 1990-04-20 10:50:04
1 1972-06-24 22:03:04 2016-12-18 11:20:24
2 1978-02-20 20:28:27 2018-02-10 03:32:35
3 1971-09-20 13:10:15 2014-06-06 21:00:06
4 2012-09-25 11:13:48 1970-03-09 07:51:55
data['间隔'] = data['日期1'] - data['日期2']
data['间隔'] = data['间隔'].apply(lambda x: x.days)
data
           
日期1 日期2 间隔
2009-04-30 04:12:39 1990-04-20 10:50:04 6949
1 1972-06-24 22:03:04 2016-12-18 11:20:24 -16248
2 1978-02-20 20:28:27 2018-02-10 03:32:35 -14600
3 1971-09-20 13:10:15 2014-06-06 21:00:06 -15601
4 2012-09-25 11:13:48 1970-03-09 07:51:55 15541
5 1987-10-02 22:19:30 2004-05-07 06:11:36 -6062
6 1992-03-10 12:30:02 1981-12-14 19:46:38 3738
7 1977-02-15 06:07:52 2016-03-19 14:59:26 -14278
8 2008-10-18 14:07:05 1995-07-18 02:32:49 4841
9 1970-05-28 23:34:24 1990-11-12 11:48:09 -7473
data['间隔_re'] = list(map(lambda x: x.days, pd.to_datetime('today') - data['日期1']))
data.head()
           
日期1 日期2 间隔 间隔_re
2009-04-30 04:12:39 1990-04-20 10:50:04 6949 3978
1 1972-06-24 22:03:04 2016-12-18 11:20:24 -16248 17436
2 1978-02-20 20:28:27 2018-02-10 03:32:35 -14600 15369
3 1971-09-20 13:10:15 2014-06-06 21:00:06 -15601 17714
4 2012-09-25 11:13:48 1970-03-09 07:51:55 15541 2734

格式化丨datetime.strftime() 丨★

# 示例数据
import pandas as pd
import numpy as np
data = pd.read_excel('C:/Users/users/Desktop/Python课件/课件编写/data/p4_数据清洗2.xlsx',index_col=0)
data.head()
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
N2020_0 范金凤 四川省 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 41 0.700930 2009-06-28 16:36:39 488
1 N2020_1 李平 北京市 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 46 0.057950 2009-11-25 07:11:24 616
2 N2020_2 李林 福建省 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 31 0.648331 1992-05-08 23:04:30 835
3 N2020_3 王玉华 台湾省 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 49 0.449515 1990-02-22 12:35:34 589
4 N2020_4 赵平 天津市 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 38 0.160348 2013-12-02 20:31:27 922
from datetime import datetime
data['日期_re'] = [datetime.strftime(x,'%Y-%m-%d') for x in data['日期']]
data.head()
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售 日期_re
N2020_0 范金凤 四川省 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 41 0.700930 2009-06-28 16:36:39 488 2009-06-28
1 N2020_1 李平 北京市 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 46 0.057950 2009-11-25 07:11:24 616 2009-11-25
2 N2020_2 李林 福建省 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 31 0.648331 1992-05-08 23:04:30 835 1992-05-08
3 N2020_3 王玉华 台湾省 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 49 0.449515 1990-02-22 12:35:34 589 1990-02-22
4 N2020_4 赵平 天津市 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 38 0.160348 2013-12-02 20:31:27 922 2013-12-02
data.dtypes
           
编号               object
姓名               object
性别               object
省份               object
公司               object
身份证号             object
邮箱               object
手机号               int64
年龄                int64
完成率             float64
日期       datetime64[ns]
销售                int64
日期_re            object
dtype: object
           

日期索引丨set_index()

import pandas as pd
import numpy as np
data = pd.read_excel('C:/Users/users/Desktop/Python课件/课件编写/data/p4_数据清洗2.xlsx',index_col=0)
data.head()
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 日期 销售
N2020_0 范金凤 四川省 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 41 0.700930 2009-06-28 16:36:39 488
1 N2020_1 李平 北京市 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 46 0.057950 2009-11-25 07:11:24 616
2 N2020_2 李林 福建省 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 31 0.648331 1992-05-08 23:04:30 835
3 N2020_3 王玉华 台湾省 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 49 0.449515 1990-02-22 12:35:34 589
4 N2020_4 赵平 天津市 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 38 0.160348 2013-12-02 20:31:27 922
# 设置日期索引
data.set_index('日期',inplace=True)
data.head()
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 销售
日期
2009-06-28 16:36:39 N2020_0 范金凤 四川省 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 41 0.700930 488
2009-11-25 07:11:24 N2020_1 李平 北京市 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 46 0.057950 616
1992-05-08 23:04:30 N2020_2 李林 福建省 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 31 0.648331 835
1990-02-22 12:35:34 N2020_3 王玉华 台湾省 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 49 0.449515 589
2013-12-02 20:31:27 N2020_4 赵平 天津市 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 38 0.160348 922

日期筛选 丨★★★

# 按日期筛选
data['2019']
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 销售
日期
2019-07-16 12:20:13 N2020_22 陆岩 浙江省 毕博诚科技有限公司 542522198007113665 [email protected] 14576069728 38 0.566517 262
2019-12-30 06:36:17 N2020_36 伍荣 广西壮族自治区 富罳网络有限公司 230882197007262293 [email protected] 18200579436 46 0.773116 674
2019-11-13 07:39:06 N2020_57 刘红梅 宁夏回族自治区 华成育卓网络有限公司 431102193803033408 [email protected] 13235351585 36 0.368342 436
2019-06-26 04:44:02 N2020_71 韩凤英 四川省 网新恒天网络有限公司 152202194306033785 [email protected] 13699762247 39 0.089812 760
2019-10-02 12:23:51 N2020_73 卢丹 上海市 盟新科技有限公司 370202194101232333 [email protected] 15682747497 35 0.691084 761
# 按日期筛选
data['2019-11']  # 不能写成201911
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 销售
日期
2019-11-13 07:39:06 N2020_57 刘红梅 宁夏回族自治区 华成育卓网络有限公司 431102193803033408 [email protected] 13235351585 36 0.368342 436
# 按日期筛选
data['2019-11-01' : '2019-11-20']
           
编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 销售
日期
2019-11-13 07:39:06 N2020_57 刘红梅 宁夏回族自治区 华成育卓网络有限公司 431102193803033408 [email protected] 13235351585 36 0.368342 436

改变日期数据频率丨to_period()

编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 销售
日期
2009-06 N2020_0 范金凤 四川省 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 41 0.700930 488
2009-11 N2020_1 李平 北京市 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 46 0.057950 616
1992-05 N2020_2 李林 福建省 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 31 0.648331 835
1990-02 N2020_3 王玉华 台湾省 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 49 0.449515 589
2013-12 N2020_4 赵平 天津市 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 38 0.160348 922
日期 编号 姓名 性别 省份 公司 身份证号 邮箱 手机号 年龄 完成率 销售
2009 N2020_0 范金凤 四川省 方正科技信息有限公司 320401200112288520 [email protected] 13104093059 41 0.700930 488
1 2009 N2020_1 李平 北京市 东方峻景科技有限公司 623001196812267643 [email protected] 14558214788 46 0.057950 616
2 1992 N2020_2 李林 福建省 昊嘉传媒有限公司 131000193309129587 [email protected] 15872567938 31 0.648331 835
3 1990 N2020_3 王玉华 台湾省 商软冠联网络有限公司 340822198708022149 [email protected] 18651489092 49 0.449515 589
4 2013 N2020_4 赵平 天津市 商软冠联传媒有限公司 33070219791019772X [email protected] 18027050254 38 0.160348 922

本节重点

  • 缺失值填充
  • 缺失值删除:subset参数
  • 重复值删除:subset参数
  • 更改列名:columns参数
  • 替换
  • 排序