Python數據分析基礎_第4節:數據清洗

數據清洗

# 示例數據
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(10,100,(10,3)), columns=list('ABC'))
df.iloc[3:5, 0] = np.nan
df.iloc[4:6, 1] = np.nan
df.iloc[5:8, 2] = np.nan
df.head()
A B C
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      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
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 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
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 [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() 丨★

data1.reset_index().head()
省份 編號 姓名 性別 公司 身份證號 郵箱 手機號 年齡 完成率 日期 銷售
0 四川省 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
data2.reset_index(level=1).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

更新索引丨reindex() 丨★

data3 = data.head()
data3
編號 姓名 性別 省份 公司 身份證號 郵箱 手機號 年齡 完成率 日期 銷售
0 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
data3.reindex([2,3,0,1,4],fill_value=0) #fill_value 當不存在時顯示0
編號 姓名 性別 省份 公司 身份證號 郵箱 手機號 年齡 完成率 日期 銷售
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
0 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()

data1.sort_index(ascending=False).head()
編號 姓名 性別 公司 身份證號 郵箱 手機號 年齡 完成率 日期 銷售
省份
黑龍江省 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
data2.sort_index(level=1,ascending=False).head()
編號 性別 公司 身份證號 郵箱 手機號 年齡 完成率 日期 銷售
省份 姓名
臺灣省 黃燕 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
data2.sort_index(level=[0,1],ascending=[False,False]).head()
編號 性別 公司 身份證號 郵箱 手機號 年齡 完成率 日期 銷售
省份 姓名
黑龍江省 鄭敏 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)
姓名 省份
0 範金鳳 四川省
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()
編號 姓名 性別 省份 公司 身份證號 郵箱 手機號 年齡 完成率 日期 銷售
0 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()

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 [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
data.groupby('省份',as_index=False).apply(lambda x: x[x['完成率']>0.95]).head()  #爲什麼兩個索引
編號 姓名 性別 省份 公司 身份證號 郵箱 手機號 年齡 完成率 日期 銷售
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()

data.loc[data['省份']=='四川省'].head()
編號 姓名 性別 省份 公司 身份證號 郵箱 手機號 年齡 完成率 日期 銷售
0 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
data.loc[data['年齡']>35].head()
編號 姓名 性別 省份 公司 身份證號 郵箱 手機號 年齡 完成率 日期 銷售
0 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
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 [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
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 [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
0 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()
編號 姓名 性別 省份 公司 身份證號 郵箱 手機號 年齡 完成率 日期 銷售
0 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()

data.to_period('M').head()  # 只針對索引
編號 姓名 性別 省份 公司 身份證號 郵箱 手機號 年齡 完成率 銷售
日期
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
data.to_period('Y').reset_index().head()
日期 編號 姓名 性別 省份 公司 身份證號 郵箱 手機號 年齡 完成率 銷售
0 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參數
  • 替換
  • 排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章