数据清洗
# 示例数据
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参数
- 替换
- 排序