数据清洗
# 示例数据
import pandas as pd
import numpy as npdf = 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
|
0
|
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 float641 B 8 non-null float642 C 7 non-null float64
dtypes: float64(3)
memory usage: 368.0 bytes
缺失值填充 丨★★
# 所有缺失值都填充为0,不常用。一般只针对某个变量进行填充
df.fillna(0)
|
A
|
B
|
C
|
0
|
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
|
0
|
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
|
0
|
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
|
0
|
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
|
0
|
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
|
0
|
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
|
0
|
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
|
0
|
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
|
0
|
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
|
0
|
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
|
性别
|
考试年份
|
科目
|
是否参加
|
是否通过
|
是否录用
|
得分
|
0
|
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
|
性别
|
考试年份
|
科目
|
是否参加
|
是否通过
|
是否录用
|
得分
|
0
|
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
|
性别
|
考试年份
|
科目
|
是否参加
|
是否通过
|
是否录用
|
得分
|
0
|
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
|
性别
|
考试年份
|
科目
|
是否参加
|
是否通过
|
是否录用
|
得分
|
0
|
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
|
性别
|
考试年份
|
科目
|
是否参加
|
是否通过
|
是否录用
|
得分
|
0
|
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
|
性别
|
考试年份
|
科目
|
是否参加
|
是否通过
|
是否录用
|
得分
|
0
|
N20000
|
0
|
2007
|
数学
|
是
|
否
|
True
|
48
|
1
|
N20001
|
0
|
2007
|
数学
|
是
|
是
|
True
|
99
|
2
|
N20002
|
0
|
2007
|
生物
|
是
|
是
|
True
|
75
|
3
|
N20003
|
0
|
2008
|
数学
|
是
|
是
|
False
|
80
|
4
|
N20004
|
0
|
2008
|
数学
|
否
|
否
|
False
|
42
|
5
|
N20005
|
0
|
2008
|
数学
|
是
|
是
|
False
|
80
|
6
|
N20006
|
0
|
2008
|
数学
|
是
|
是
|
False
|
72
|
7
|
N20007
|
0
|
2009
|
数学
|
是
|
是
|
True
|
68
|
8
|
N20008
|
0
|
2009
|
生物
|
是
|
否
|
True
|
36
|
9
|
N20009
|
0
|
2009
|
生物
|
是
|
是
|
False
|
78
|
字符串处理
字符串拆分 丨str.split() 丨★★★
# 示例数据
import pandas as pd
import numpy as nps2 = 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
s2.str.split('_').str.get(1)
0 b
1 d
2 NaN
3 g
dtype: object
s2.str.split('_').str[1] # ★★★
0 b
1 d
2 NaN
3 g
dtype: object
s2.str.split('_', expand=True) #展开
|
0
|
1
|
2
|
0
|
a
|
b
|
c
|
1
|
c
|
d
|
e
|
2
|
NaN
|
NaN
|
NaN
|
3
|
f
|
g
|
h
|
s2.str.split('_', expand=True, n=1)
|
0
|
1
|
0
|
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
|
0
|
-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
|
0
|
-1.254242
|
0.331579
|
1
|
-0.308600
|
-0.153735
|
2
|
0.678931
|
-1.913554
|
转换成小写 丨str.lower()
s1.str.lower()
0 jack
1 jill
2 jesse
3 frank
dtype: object
转换成大写 丨str.upper()
s1.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
|
0
|
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
|
0
|
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
|
0
|
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
|
0
|
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
|
0
|
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
|
0
|
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
|
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
|
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()
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
0
|
N2020_0
|
范金凤
|
女
|
四川省
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
33
|
0.377441
|
2009-06-28 16:36:39
|
488
|
1
|
N2020_1
|
李平
|
男
|
北京市
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
43
|
0.064251
|
2009-11-25 07:11:24
|
616
|
2
|
N2020_2
|
李林
|
男
|
福建省
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
43
|
0.495049
|
1992-05-08 23:04:30
|
835
|
3
|
N2020_3
|
王玉华
|
女
|
台湾省
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
35
|
0.340037
|
1990-02-22 12:35:34
|
589
|
4
|
N2020_4
|
赵平
|
女
|
天津市
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
18027050254
|
41
|
0.578136
|
2013-12-02 20:31:27
|
922
|
data1 = data.set_index('省份')
data1.head()
|
编号
|
姓名
|
性别
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
省份
|
|
|
|
|
|
|
|
|
|
|
|
四川省
|
N2020_0
|
范金凤
|
女
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
33
|
0.377441
|
2009-06-28 16:36:39
|
488
|
北京市
|
N2020_1
|
李平
|
男
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
43
|
0.064251
|
2009-11-25 07:11:24
|
616
|
福建省
|
N2020_2
|
李林
|
男
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
43
|
0.495049
|
1992-05-08 23:04:30
|
835
|
台湾省
|
N2020_3
|
王玉华
|
女
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
35
|
0.340037
|
1990-02-22 12:35:34
|
589
|
天津市
|
N2020_4
|
赵平
|
女
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
18027050254
|
41
|
0.578136
|
2013-12-02 20:31:27
|
922
|
data2 = data.set_index(['省份','姓名'])
data2.head()
|
|
编号
|
性别
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
省份
|
姓名
|
|
|
|
|
|
|
|
|
|
|
四川省
|
范金凤
|
N2020_0
|
女
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
33
|
0.377441
|
2009-06-28 16:36:39
|
488
|
北京市
|
李平
|
N2020_1
|
男
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
43
|
0.064251
|
2009-11-25 07:11:24
|
616
|
福建省
|
李林
|
N2020_2
|
男
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
43
|
0.495049
|
1992-05-08 23:04:30
|
835
|
台湾省
|
王玉华
|
N2020_3
|
女
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
35
|
0.340037
|
1990-02-22 12:35:34
|
589
|
天津市
|
赵平
|
N2020_4
|
女
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
18027050254
|
41
|
0.578136
|
2013-12-02 20:31:27
|
922
|
重置索引丨reset_index() 丨★
data1.reset_index().head()
|
省份
|
编号
|
姓名
|
性别
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
0
|
四川省
|
N2020_0
|
范金凤
|
女
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
33
|
0.377441
|
2009-06-28 16:36:39
|
488
|
1
|
北京市
|
N2020_1
|
李平
|
男
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
43
|
0.064251
|
2009-11-25 07:11:24
|
616
|
2
|
福建省
|
N2020_2
|
李林
|
男
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
43
|
0.495049
|
1992-05-08 23:04:30
|
835
|
3
|
台湾省
|
N2020_3
|
王玉华
|
女
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
35
|
0.340037
|
1990-02-22 12:35:34
|
589
|
4
|
天津市
|
N2020_4
|
赵平
|
女
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
18027050254
|
41
|
0.578136
|
2013-12-02 20:31:27
|
922
|
data2.reset_index(level=1).head()
|
姓名
|
编号
|
性别
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
省份
|
|
|
|
|
|
|
|
|
|
|
|
四川省
|
范金凤
|
N2020_0
|
女
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
33
|
0.377441
|
2009-06-28 16:36:39
|
488
|
北京市
|
李平
|
N2020_1
|
男
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
43
|
0.064251
|
2009-11-25 07:11:24
|
616
|
福建省
|
李林
|
N2020_2
|
男
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
43
|
0.495049
|
1992-05-08 23:04:30
|
835
|
台湾省
|
王玉华
|
N2020_3
|
女
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
35
|
0.340037
|
1990-02-22 12:35:34
|
589
|
天津市
|
赵平
|
N2020_4
|
女
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
18027050254
|
41
|
0.578136
|
2013-12-02 20:31:27
|
922
|
更新索引丨reindex() 丨★
data3 = data.head()
data3
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
0
|
N2020_0
|
范金凤
|
女
|
四川省
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
33
|
0.377441
|
2009-06-28 16:36:39
|
488
|
1
|
N2020_1
|
李平
|
男
|
北京市
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
43
|
0.064251
|
2009-11-25 07:11:24
|
616
|
2
|
N2020_2
|
李林
|
男
|
福建省
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
43
|
0.495049
|
1992-05-08 23:04:30
|
835
|
3
|
N2020_3
|
王玉华
|
女
|
台湾省
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
35
|
0.340037
|
1990-02-22 12:35:34
|
589
|
4
|
N2020_4
|
赵平
|
女
|
天津市
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
18027050254
|
41
|
0.578136
|
2013-12-02 20:31:27
|
922
|
data3.reindex([2,3,0,1,4],fill_value=0) #fill_value 当不存在时显示0
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
2
|
N2020_2
|
李林
|
男
|
福建省
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
43
|
0.495049
|
1992-05-08 23:04:30
|
835
|
3
|
N2020_3
|
王玉华
|
女
|
台湾省
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
35
|
0.340037
|
1990-02-22 12:35:34
|
589
|
0
|
N2020_0
|
范金凤
|
女
|
四川省
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
33
|
0.377441
|
2009-06-28 16:36:39
|
488
|
1
|
N2020_1
|
李平
|
男
|
北京市
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
43
|
0.064251
|
2009-11-25 07:11:24
|
616
|
4
|
N2020_4
|
赵平
|
女
|
天津市
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
18027050254
|
41
|
0.578136
|
2013-12-02 20:31:27
|
922
|
索引排序丨sort_index()
data1.sort_index(ascending=False).head()
|
编号
|
姓名
|
性别
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
省份
|
|
|
|
|
|
|
|
|
|
|
|
黑龙江省
|
N2020_75
|
刘鑫
|
女
|
超艺传媒有限公司
|
210701194711181795
|
zhaojun@example.com
|
13228202589
|
47
|
0.974812
|
1974-12-29 11:36:42
|
155
|
黑龙江省
|
N2020_55
|
蒋文
|
男
|
惠派国际公司信息有限公司
|
52272619661221162X
|
fangchang@example.com
|
18636530837
|
42
|
0.304991
|
1971-10-22 00:37:03
|
259
|
黑龙江省
|
N2020_18
|
郑敏
|
男
|
彩虹信息有限公司
|
410200194702267611
|
gyin@example.org
|
15646946384
|
46
|
0.381412
|
1997-04-21 04:29:16
|
132
|
香港特别行政区
|
N2020_39
|
高洁
|
男
|
商软冠联信息有限公司
|
50011519990112238X
|
lixue@example.org
|
13209584706
|
34
|
0.017030
|
1999-07-18 21:25:45
|
699
|
香港特别行政区
|
N2020_19
|
梁雪
|
男
|
银嘉科技有限公司
|
330825197106213864
|
yan14@example.org
|
13488583474
|
38
|
0.925357
|
1981-10-04 09:20:40
|
994
|
data2.sort_index(level=1,ascending=False).head()
|
|
编号
|
性别
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
省份
|
姓名
|
|
|
|
|
|
|
|
|
|
|
台湾省
|
黄燕
|
N2020_87
|
女
|
易动力传媒有限公司
|
370829199012030735
|
yong70@example.com
|
13242323364
|
31
|
0.471365
|
1985-08-17 18:52:10
|
408
|
西藏自治区
|
黄峰
|
N2020_13
|
男
|
良诺科技有限公司
|
510801193903095981
|
leifu@example.net
|
15660156361
|
36
|
0.986889
|
2016-03-23 15:45:29
|
291
|
宁夏回族自治区
|
黄丽丽
|
N2020_11
|
女
|
华远软件传媒有限公司
|
510114196409150161
|
tanchao@example.org
|
18137834227
|
37
|
0.885827
|
1987-08-14 18:46:45
|
382
|
香港特别行政区
|
高洁
|
N2020_39
|
男
|
商软冠联信息有限公司
|
50011519990112238X
|
lixue@example.org
|
13209584706
|
34
|
0.017030
|
1999-07-18 21:25:45
|
699
|
江苏省
|
马彬
|
N2020_45
|
女
|
凌云信息有限公司
|
36073319691231944X
|
qiang04@example.net
|
13578076912
|
43
|
0.573776
|
1990-01-29 02:45:42
|
160
|
data2.sort_index(level=[0,1],ascending=[False,False]).head()
|
|
编号
|
性别
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
省份
|
姓名
|
|
|
|
|
|
|
|
|
|
|
黑龙江省
|
郑敏
|
N2020_18
|
男
|
彩虹信息有限公司
|
410200194702267611
|
gyin@example.org
|
15646946384
|
46
|
0.381412
|
1997-04-21 04:29:16
|
132
|
蒋文
|
N2020_55
|
男
|
惠派国际公司信息有限公司
|
52272619661221162X
|
fangchang@example.com
|
18636530837
|
42
|
0.304991
|
1971-10-22 00:37:03
|
259
|
刘鑫
|
N2020_75
|
女
|
超艺传媒有限公司
|
210701194711181795
|
zhaojun@example.com
|
13228202589
|
47
|
0.974812
|
1974-12-29 11:36:42
|
155
|
香港特别行政区
|
高洁
|
N2020_39
|
男
|
商软冠联信息有限公司
|
50011519990112238X
|
lixue@example.org
|
13209584706
|
34
|
0.017030
|
1999-07-18 21:25:45
|
699
|
梁雪
|
N2020_19
|
男
|
银嘉科技有限公司
|
330825197106213864
|
yan14@example.org
|
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)
|
姓名
|
省份
|
0
|
范金凤
|
四川省
|
1
|
李平
|
北京市
|
2
|
李林
|
福建省
|
3
|
王玉华
|
台湾省
|
4
|
赵平
|
天津市
|
5
|
陈桂花
|
河南省
|
6
|
韦亮
|
福建省
|
7
|
钟瑜
|
新疆维吾尔自治区
|
8
|
刘桂花
|
山东省
|
9
|
刘桂花
|
辽宁省
|
筛选行
# 1个条件筛选
data[data['省份']=='北京市']
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
1
|
N2020_1
|
李平
|
男
|
北京市
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
46
|
0.057950
|
2009-11-25 07:11:24
|
616
|
23
|
N2020_23
|
李慧
|
女
|
北京市
|
巨奥信息有限公司
|
450223196310134685
|
bsong@example.com
|
18597786292
|
34
|
0.710752
|
1971-10-30 04:34:58
|
785
|
# 多条件筛选
data[(data['性别']=='男')&(data['省份']=='四川省')]
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
29
|
N2020_29
|
温云
|
男
|
四川省
|
创汇传媒有限公司
|
411621195006187174
|
jun93@example.org
|
15764016109
|
30
|
0.037330
|
1995-07-27 08:30:33
|
005
|
52
|
N2020_52
|
陈秀梅
|
男
|
四川省
|
艾提科信科技有限公司
|
621022196409096901
|
fuxia@example.net
|
18797029868
|
36
|
0.735764
|
2014-02-16 02:19:28
|
005
|
56
|
N2020_56
|
徐艳
|
男
|
四川省
|
超艺网络有限公司
|
230404195602088429
|
ntang@example.org
|
15730053639
|
36
|
0.285640
|
1977-07-27 07:27:07
|
782
|
71
|
N2020_71
|
韩凤英
|
男
|
四川省
|
网新恒天网络有限公司
|
152202194306033785
|
cfeng@example.net
|
13699762247
|
39
|
0.089812
|
2019-06-26 04:44:02
|
760
|
根据内容精确匹配丨isin() 丨★★
# isin()
data[data['省份'].isin(['山东省','四川省'])].head()
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
0
|
N2020_0
|
范金凤
|
女
|
四川省
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
41
|
0.700930
|
2009-06-28 16:36:39
|
488
|
8
|
N2020_8
|
刘桂花
|
男
|
山东省
|
恩悌网络有限公司
|
230184197702140647
|
guochao@example.net
|
13310655117
|
34
|
0.516789
|
2015-09-29 16:21:28
|
439
|
29
|
N2020_29
|
温云
|
男
|
四川省
|
创汇传媒有限公司
|
411621195006187174
|
jun93@example.org
|
15764016109
|
30
|
0.037330
|
1995-07-27 08:30:33
|
005
|
35
|
N2020_35
|
宋楠
|
男
|
山东省
|
恒聪百汇网络有限公司
|
370213199602238217
|
yeming@example.com
|
13027921428
|
47
|
0.253179
|
1980-10-16 17:48:44
|
451
|
52
|
N2020_52
|
陈秀梅
|
男
|
四川省
|
艾提科信科技有限公司
|
621022196409096901
|
fuxia@example.net
|
18797029868
|
36
|
0.735764
|
2014-02-16 02:19:28
|
005
|
# isin()
data[data['年龄'].isin([35,36,38])].head()
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
4
|
N2020_4
|
赵平
|
女
|
天津市
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
18027050254
|
38
|
0.160348
|
2013-12-02 20:31:27
|
922
|
5
|
N2020_5
|
陈桂花
|
女
|
河南省
|
华泰通安科技有限公司
|
51343219440729157X
|
tianyan@example.com
|
15115129137
|
35
|
0.176635
|
2011-04-05 20:09:54
|
006
|
6
|
N2020_6
|
韦亮
|
女
|
福建省
|
合联电子科技有限公司
|
610730195403213354
|
yinmin@example.org
|
13680169513
|
36
|
0.713555
|
1988-09-08 02:15:10
|
769
|
7
|
N2020_7
|
钟瑜
|
女
|
新疆维吾尔自治区
|
浙大万朋传媒有限公司
|
632823199206261862
|
qiang32@example.net
|
15636503787
|
35
|
0.615502
|
2010-03-08 11:00:32
|
435
|
10
|
N2020_10
|
林秀兰
|
男
|
吉林省
|
恩悌科技有限公司
|
532524196805192224
|
tao83@example.com
|
14522841055
|
38
|
0.535469
|
1970-02-01 06:55:39
|
602
|
根据内容模糊匹配丨str.contains() 丨★★
# str.contains()
data[data['公司'].str.contains('动力')].head()
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
21
|
N2020_21
|
方琳
|
男
|
青海省
|
易动力网络有限公司
|
130481196911267803
|
kshao@example.com
|
14509729550
|
32
|
0.754724
|
2017-12-27 19:42:26
|
277
|
37
|
N2020_37
|
王梅
|
女
|
辽宁省
|
易动力科技有限公司
|
370812194801193481
|
yan07@example.org
|
18574736528
|
46
|
0.706331
|
1972-03-16 17:56:14
|
810
|
62
|
N2020_62
|
陈梅
|
女
|
四川省
|
易动力网络有限公司
|
341126199909224292
|
naduan@example.org
|
13818527086
|
34
|
0.969633
|
1970-02-04 14:33:40
|
411
|
87
|
N2020_87
|
黄燕
|
女
|
台湾省
|
易动力传媒有限公司
|
370829199012030735
|
yong70@example.com
|
13242323364
|
44
|
0.975404
|
1985-08-17 18:52:10
|
408
|
94
|
N2020_94
|
余建
|
女
|
西藏自治区
|
易动力网络有限公司
|
500120197803071859
|
yzhang@example.com
|
13304313249
|
32
|
0.055106
|
2008-05-29 04:44:57
|
194
|
# str.contains()
data[data['公司'].str.contains('计算机|动力')].head()
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
21
|
N2020_21
|
方琳
|
男
|
青海省
|
易动力网络有限公司
|
130481196911267803
|
kshao@example.com
|
14509729550
|
32
|
0.754724
|
2017-12-27 19:42:26
|
277
|
37
|
N2020_37
|
王梅
|
女
|
辽宁省
|
易动力科技有限公司
|
370812194801193481
|
yan07@example.org
|
18574736528
|
46
|
0.706331
|
1972-03-16 17:56:14
|
810
|
62
|
N2020_62
|
陈梅
|
女
|
四川省
|
易动力网络有限公司
|
341126199909224292
|
naduan@example.org
|
13818527086
|
34
|
0.969633
|
1970-02-04 14:33:40
|
411
|
70
|
N2020_70
|
徐涛
|
女
|
四川省
|
晖来计算机信息有限公司
|
441201195906202227
|
guiying06@example.com
|
13422409521
|
36
|
0.353785
|
1994-04-02 12:23:33
|
743
|
87
|
N2020_87
|
黄燕
|
女
|
台湾省
|
易动力传媒有限公司
|
370829199012030735
|
yong70@example.com
|
13242323364
|
44
|
0.975404
|
1985-08-17 18:52:10
|
408
|
根据字符串长度 丨str.len()
s1.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
|
值
|
0
|
HELLO
|
1
|
world
|
2
|
China
|
3
|
Python
|
4
|
|
5
|
10
|
6
|
100
|
7
|
字符串
|
8
|
data
|
9
|
NaN
|
# #所有字符都是数字或者字母
df['字符串数值或者字母'] = df['值'].str.isalnum()
df
|
值
|
字符串数值或者字母
|
0
|
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
|
值
|
字符串数值或者字母
|
字母
|
0
|
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
|
值
|
字符串数值或者字母
|
字母
|
字符串数字
|
0
|
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
|
值
|
字符串数值或者字母
|
字母
|
字符串数字
|
小写字母
|
0
|
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
|
值
|
字符串数值或者字母
|
字母
|
字符串数字
|
小写字母
|
大写字母
|
0
|
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
|
值
|
字符串数值或者字母
|
字母
|
字符串数字
|
小写字母
|
大写字母
|
首字母大写
|
0
|
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
|
值
|
字符串数值或者字母
|
字母
|
字符串数字
|
小写字母
|
大写字母
|
首字母大写
|
空格
|
0
|
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()
|
省份
|
编号
|
姓名
|
性别
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
0
|
上海市
|
N2020_73
|
卢丹
|
女
|
盟新科技有限公司
|
370202194101232333
|
guiyingshi@example.org
|
15682747497
|
35
|
0.691084
|
2019-10-02 12:23:51
|
761
|
1
|
云南省
|
N2020_97
|
陈帅
|
男
|
商软冠联网络有限公司
|
46902319400324717X
|
cuimin@example.net
|
14529122727
|
37
|
0.635785
|
2007-05-29 09:35:04
|
564
|
2
|
内蒙古自治区
|
N2020_47
|
谭利
|
女
|
时刻网络有限公司
|
140321194101147472
|
yan48@example.org
|
13363990254
|
32
|
0.910402
|
2011-11-03 00:34:49
|
373
|
3
|
北京市
|
N2020_23
|
李慧
|
女
|
巨奥信息有限公司
|
450223196310134685
|
bsong@example.com
|
18597786292
|
34
|
0.710752
|
1971-10-30 04:34:58
|
785
|
4
|
台湾省
|
N2020_61
|
曹凯
|
女
|
南康科技有限公司
|
150502196806098191
|
xiulanpan@example.org
|
13262601832
|
31
|
0.622077
|
1983-02-03 04:28:03
|
913
|
data.groupby('省份',as_index=False).apply(lambda x: x[x['完成率']>0.95]).head() #为什么两个索引
|
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
4
|
87
|
N2020_87
|
黄燕
|
女
|
台湾省
|
易动力传媒有限公司
|
370829199012030735
|
yong70@example.com
|
13242323364
|
44
|
0.975404
|
1985-08-17 18:52:10
|
408
|
5
|
33
|
N2020_33
|
冯璐
|
女
|
吉林省
|
太极科技有限公司
|
411381195107138515
|
pjia@example.org
|
13982410034
|
31
|
0.981835
|
2017-07-01 01:55:38
|
507
|
6
|
62
|
N2020_62
|
陈梅
|
女
|
四川省
|
易动力网络有限公司
|
341126199909224292
|
naduan@example.org
|
13818527086
|
34
|
0.969633
|
1970-02-04 14:33:40
|
411
|
9
|
51
|
N2020_51
|
李伟
|
男
|
安徽省
|
商软冠联网络有限公司
|
530701193409160440
|
taoduan@example.org
|
15322916084
|
34
|
0.982004
|
2006-04-29 07:34:08
|
977
|
15
|
96
|
N2020_96
|
李淑华
|
女
|
江西省
|
襄樊地球村信息有限公司
|
542431194904214928
|
xiulan99@example.org
|
13447067886
|
31
|
0.966989
|
1977-11-06 19:40:07
|
529
|
loc()
data.loc[data['省份']=='四川省'].head()
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
0
|
N2020_0
|
范金凤
|
女
|
四川省
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
41
|
0.700930
|
2009-06-28 16:36:39
|
488
|
29
|
N2020_29
|
温云
|
男
|
四川省
|
创汇传媒有限公司
|
411621195006187174
|
jun93@example.org
|
15764016109
|
30
|
0.037330
|
1995-07-27 08:30:33
|
005
|
52
|
N2020_52
|
陈秀梅
|
男
|
四川省
|
艾提科信科技有限公司
|
621022196409096901
|
fuxia@example.net
|
18797029868
|
36
|
0.735764
|
2014-02-16 02:19:28
|
005
|
56
|
N2020_56
|
徐艳
|
男
|
四川省
|
超艺网络有限公司
|
230404195602088429
|
ntang@example.org
|
15730053639
|
36
|
0.285640
|
1977-07-27 07:27:07
|
782
|
62
|
N2020_62
|
陈梅
|
女
|
四川省
|
易动力网络有限公司
|
341126199909224292
|
naduan@example.org
|
13818527086
|
34
|
0.969633
|
1970-02-04 14:33:40
|
411
|
data.loc[data['年龄']>35].head()
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
0
|
N2020_0
|
范金凤
|
女
|
四川省
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
41
|
0.700930
|
2009-06-28 16:36:39
|
488
|
1
|
N2020_1
|
李平
|
男
|
北京市
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
46
|
0.057950
|
2009-11-25 07:11:24
|
616
|
3
|
N2020_3
|
王玉华
|
男
|
台湾省
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
49
|
0.449515
|
1990-02-22 12:35:34
|
589
|
4
|
N2020_4
|
赵平
|
女
|
天津市
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
18027050254
|
38
|
0.160348
|
2013-12-02 20:31:27
|
922
|
6
|
N2020_6
|
韦亮
|
女
|
福建省
|
合联电子科技有限公司
|
610730195403213354
|
yinmin@example.org
|
13680169513
|
36
|
0.713555
|
1988-09-08 02:15:10
|
769
|
data.loc[data['年龄']>35,['姓名','销售']].head()
|
姓名
|
销售
|
0
|
范金凤
|
488
|
1
|
李平
|
616
|
3
|
王玉华
|
589
|
4
|
赵平
|
922
|
6
|
韦亮
|
769
|
iloc()
data.iloc[[2,3,5],[0,1,2]].head()
|
编号
|
姓名
|
性别
|
2
|
N2020_2
|
李林
|
男
|
3
|
N2020_3
|
王玉华
|
男
|
5
|
N2020_5
|
陈桂花
|
女
|
data.iloc[2:,[0,1,2]].head()
|
编号
|
姓名
|
性别
|
2
|
N2020_2
|
李林
|
男
|
3
|
N2020_3
|
王玉华
|
男
|
4
|
N2020_4
|
赵平
|
女
|
5
|
N2020_5
|
陈桂花
|
女
|
6
|
N2020_6
|
韦亮
|
女
|
data.iloc[[2,3,5],:].head()
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
2
|
N2020_2
|
李林
|
男
|
福建省
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
31
|
0.648331
|
1992-05-08 23:04:30
|
835
|
3
|
N2020_3
|
王玉华
|
男
|
台湾省
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
49
|
0.449515
|
1990-02-22 12:35:34
|
589
|
5
|
N2020_5
|
陈桂花
|
女
|
河南省
|
华泰通安科技有限公司
|
51343219440729157X
|
tianyan@example.com
|
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
|
0
|
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
|
0
|
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()
|
日期
|
值
|
0
|
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
|
0
|
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
|
0
|
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
|
0
|
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
|
间隔
|
0
|
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
|
0
|
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()
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
0
|
N2020_0
|
范金凤
|
女
|
四川省
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
41
|
0.700930
|
2009-06-28 16:36:39
|
488
|
1
|
N2020_1
|
李平
|
男
|
北京市
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
46
|
0.057950
|
2009-11-25 07:11:24
|
616
|
2
|
N2020_2
|
李林
|
男
|
福建省
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
31
|
0.648331
|
1992-05-08 23:04:30
|
835
|
3
|
N2020_3
|
王玉华
|
男
|
台湾省
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
49
|
0.449515
|
1990-02-22 12:35:34
|
589
|
4
|
N2020_4
|
赵平
|
女
|
天津市
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
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
|
0
|
N2020_0
|
范金凤
|
女
|
四川省
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
41
|
0.700930
|
2009-06-28 16:36:39
|
488
|
2009-06-28
|
1
|
N2020_1
|
李平
|
男
|
北京市
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
46
|
0.057950
|
2009-11-25 07:11:24
|
616
|
2009-11-25
|
2
|
N2020_2
|
李林
|
男
|
福建省
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
31
|
0.648331
|
1992-05-08 23:04:30
|
835
|
1992-05-08
|
3
|
N2020_3
|
王玉华
|
男
|
台湾省
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
49
|
0.449515
|
1990-02-22 12:35:34
|
589
|
1990-02-22
|
4
|
N2020_4
|
赵平
|
女
|
天津市
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
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()
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
日期
|
销售
|
0
|
N2020_0
|
范金凤
|
女
|
四川省
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
41
|
0.700930
|
2009-06-28 16:36:39
|
488
|
1
|
N2020_1
|
李平
|
男
|
北京市
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
46
|
0.057950
|
2009-11-25 07:11:24
|
616
|
2
|
N2020_2
|
李林
|
男
|
福建省
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
31
|
0.648331
|
1992-05-08 23:04:30
|
835
|
3
|
N2020_3
|
王玉华
|
男
|
台湾省
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
49
|
0.449515
|
1990-02-22 12:35:34
|
589
|
4
|
N2020_4
|
赵平
|
女
|
天津市
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
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
|
syang@example.net
|
13104093059
|
41
|
0.700930
|
488
|
2009-11-25 07:11:24
|
N2020_1
|
李平
|
男
|
北京市
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
46
|
0.057950
|
616
|
1992-05-08 23:04:30
|
N2020_2
|
李林
|
男
|
福建省
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
31
|
0.648331
|
835
|
1990-02-22 12:35:34
|
N2020_3
|
王玉华
|
男
|
台湾省
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
49
|
0.449515
|
589
|
2013-12-02 20:31:27
|
N2020_4
|
赵平
|
女
|
天津市
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
18027050254
|
38
|
0.160348
|
922
|
日期筛选 丨★★★
# 按日期筛选
data['2019']
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
销售
|
日期
|
|
|
|
|
|
|
|
|
|
|
|
2019-07-16 12:20:13
|
N2020_22
|
陆岩
|
男
|
浙江省
|
毕博诚科技有限公司
|
542522198007113665
|
yangsun@example.com
|
14576069728
|
38
|
0.566517
|
262
|
2019-12-30 06:36:17
|
N2020_36
|
伍荣
|
男
|
广西壮族自治区
|
富罳网络有限公司
|
230882197007262293
|
dchang@example.com
|
18200579436
|
46
|
0.773116
|
674
|
2019-11-13 07:39:06
|
N2020_57
|
刘红梅
|
男
|
宁夏回族自治区
|
华成育卓网络有限公司
|
431102193803033408
|
weiye@example.net
|
13235351585
|
36
|
0.368342
|
436
|
2019-06-26 04:44:02
|
N2020_71
|
韩凤英
|
男
|
四川省
|
网新恒天网络有限公司
|
152202194306033785
|
cfeng@example.net
|
13699762247
|
39
|
0.089812
|
760
|
2019-10-02 12:23:51
|
N2020_73
|
卢丹
|
女
|
上海市
|
盟新科技有限公司
|
370202194101232333
|
guiyingshi@example.org
|
15682747497
|
35
|
0.691084
|
761
|
# 按日期筛选
data['2019-11'] # 不能写成201911
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
销售
|
日期
|
|
|
|
|
|
|
|
|
|
|
|
2019-11-13 07:39:06
|
N2020_57
|
刘红梅
|
男
|
宁夏回族自治区
|
华成育卓网络有限公司
|
431102193803033408
|
weiye@example.net
|
13235351585
|
36
|
0.368342
|
436
|
# 按日期筛选
data['2019-11-01' : '2019-11-20']
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
销售
|
日期
|
|
|
|
|
|
|
|
|
|
|
|
2019-11-13 07:39:06
|
N2020_57
|
刘红梅
|
男
|
宁夏回族自治区
|
华成育卓网络有限公司
|
431102193803033408
|
weiye@example.net
|
13235351585
|
36
|
0.368342
|
436
|
改变日期数据频率丨to_period()
data.to_period('M').head() # 只针对索引
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
销售
|
日期
|
|
|
|
|
|
|
|
|
|
|
|
2009-06
|
N2020_0
|
范金凤
|
女
|
四川省
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
41
|
0.700930
|
488
|
2009-11
|
N2020_1
|
李平
|
男
|
北京市
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
46
|
0.057950
|
616
|
1992-05
|
N2020_2
|
李林
|
男
|
福建省
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
31
|
0.648331
|
835
|
1990-02
|
N2020_3
|
王玉华
|
男
|
台湾省
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
49
|
0.449515
|
589
|
2013-12
|
N2020_4
|
赵平
|
女
|
天津市
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
18027050254
|
38
|
0.160348
|
922
|
data.to_period('Y').reset_index().head()
|
日期
|
编号
|
姓名
|
性别
|
省份
|
公司
|
身份证号
|
邮箱
|
手机号
|
年龄
|
完成率
|
销售
|
0
|
2009
|
N2020_0
|
范金凤
|
女
|
四川省
|
方正科技信息有限公司
|
320401200112288520
|
syang@example.net
|
13104093059
|
41
|
0.700930
|
488
|
1
|
2009
|
N2020_1
|
李平
|
男
|
北京市
|
东方峻景科技有限公司
|
623001196812267643
|
nayao@example.com
|
14558214788
|
46
|
0.057950
|
616
|
2
|
1992
|
N2020_2
|
李林
|
男
|
福建省
|
昊嘉传媒有限公司
|
131000193309129587
|
shichao@example.net
|
15872567938
|
31
|
0.648331
|
835
|
3
|
1990
|
N2020_3
|
王玉华
|
男
|
台湾省
|
商软冠联网络有限公司
|
340822198708022149
|
lilei@example.com
|
18651489092
|
49
|
0.449515
|
589
|
4
|
2013
|
N2020_4
|
赵平
|
女
|
天津市
|
商软冠联传媒有限公司
|
33070219791019772X
|
shenyong@example.net
|
18027050254
|
38
|
0.160348
|
922
|
本节重点
- 缺失值填充
- 缺失值删除:subset参数
- 重复值删除:subset参数
- 更改列名:columns参数
- 替换
- 排序
Python数据分析基础_第4节:数据清洗相关推荐
- Python数据分析基础: 异常值检测和处理
作者:东哥起飞 公众号:Python数据科学 上一篇分享了关于数据缺失值处理的一些方法,链接如下: [Python数据分析基础]: 数据缺失值处理 本篇继续分享数据清洗中的另一个常见问题:异常值检测和 ...
- python dataframe groupby_【Python数据分析基础】入坑必备的数据预处理操作
本文解决的是2类目标业务: 有数据不知道怎么做数据分析操作的. 自己有思路不知道怎么落地实现的. Python数据分析基础必用品 office软件(推荐2016版) Python开发环境(推荐Anac ...
- python 数据分析基础 day1-初窥内容
在读这本书之前,我已经有开始学python,用的是anaconda 的jupyter notebook. 看了<python 数据分析基础>的前言部分,发现这本书的实用性很高,其讲解的内容 ...
- python计算相关矩阵_Numpy使用大全(python矩阵相关运算大全)-Python数据分析基础2...
//2019.07.10 python数据分析基础--numpy(数据结构基础) import numpy as np: 1.python数据分析主要的功能实现模块包含以下六个方面: (1)numpy ...
- python编程基础_月隐学python第2课
python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...
- python数据分析基础教程 numpy_Python数据分析基础教程:NumPy学习指南(第2版)
Python数据分析基础教程:NumPy学习指南(第2版) Ivan Idris (作者) 张驭宇 (译者) NumPy是一个优秀的科学计算库,提供了很多实用的数学函数.强大的多维数组对象和优异的计算 ...
- python数据分析与excel_读Python数据分析基础之Excel读写与处理
对于业务型数据分析来说,Excel可以说是打交道最多的软件了,可以说没有之一.之前有比较系统地读过<Python数据分析基础>(Foundations for Analysis with ...
- Python数据分析基础之Excel文件(6)
这一篇博客主要讲一下处理多个工作簿. 之前我们已经创建了sales_2013.xlsx工作簿.在这里,我们再创建两个新的工作簿sales_2014.xlsx和sales_2015.xlsx,并 ...
- 简书python数据分析基础reading_Python数据分析基础ReadingDay5_sqlite3
reading Foundations for Analysis with Python Day 5 <Python数据分析基础>封面 这篇笔记开始记录数据库的内容,会用两篇笔记分别讲述P ...
最新文章
- 【Ubuntu】解决问题:tcp :8080: bind: address already in use
- 可视化-grafana_使用influxDB数据
- oracle10G导入导出数据文件
- 创建springboot_【小练习】创建SpringBoot程序
- laravel5.5事件系统
- void和void*
- 【转载保存】接口压力测试安装与使用
- C#登录窗口(访问数据库)的制作,类文件的制作及使用
- php 对象转xml字符串_php方法simplexml_load_string()解析xml转数组失败
- 计蒜客:区间整数操作-区间更新-区间和
- 教育计算机缩写,{教育管理}计算机缩写术语完全介绍宝典.docx
- Rust: 亿元估值AI网红代码的不同版本
- Newtonsoft 六个超简单又实用的特性【上下篇】
- 如何加速android模拟器,Android模拟器运行慢怎么办 Android模拟器如何加速【加速方法】...
- 《西部世界》第三季开播,机器人会比人类更有人性吗?
- SQL DUMB Series-3 4 通关过程分享(sql注入学习DAY2)
- 阿里副总裁、达摩院副院长金榕被曝离职!AI科学家集体“逃离“大厂…
- Android 编译优化探索
- 【LeetCode-中等】55. 跳跃游戏(详解)
- win10打开程序响应很慢_【电脑维护宝典】WIN10系统下的电脑维护
热门文章
- NetworkInfo已过时
- 何为LDO(low dropout regulator)
- 微信小程序——day02
- python判断复数_在python中复数怎么表示
- linux实验六vi文本编辑器,Linux-实验六-vi文本编辑器.docx
- STM32 CCM内存使用
- 博客园:教你如何给一篇博客加入外链
- Java面试核心知识点
- Two Way Communication Error: Function two_way_comm_post_message / two_way_comm_post_message_ex faile
- Access to XMLHttpRequest at ‘http://localhost:8080/VXApplets/UserInfoService/login‘ from origin ‘htt