Python pandas 數據清洗(二)

Python 版本:

Python 3.7.6 (default, Jan  8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.

IPython 7.12.0 -- An enhanced Interactive Python.

本節主要講解:

1.利用concat和merge對數據進行合併;

2.對空值和重複值進行處理;

3.根據條件進行數據篩選;

4.利用groupby進行分組

 

一、利用concat和merge對數據進行合併

加載包

import pandas as pd

讀取Excel文件

df1=pd.read_excel(r'F:\Python\科室數據集.xlsx',sheet_name='第一人民醫院')
df1
Out[2]: 
       機構  科室   就診人數     增長率          上期人數
0  第一人民醫院  內科  35188  0.0998  31994.908165
1  第一人民醫院  外科  28467  0.1127  25583.715287
2  第一人民醫院  婦科  35617  0.0850  32826.728111

df2=pd.read_excel(r'F:\Python\科室數據集.xlsx',sheet_name='第二人民醫院')
df2
Out[3]: 
       機構  科室  就診人數     增長率         上期人數
0  第二人民醫院  外科  1981  0.0575  1873.286052
1  第二人民醫院  內科  1958  0.1471  1706.913085
2  第二人民醫院  婦科  1532  0.0850  1411.981567

df3=pd.read_excel(r'F:\Python\科室數據集.xlsx',sheet_name='第三人民醫院')
df3
Out[4]: 
       機構  科室  就診人數     增長率         上期人數
0  第三人民醫院  外科  1780  0.1315  1573.133009
1  第三人民醫院  內科  1447  0.0104  1432.106097
2  第三人民醫院  婦科   965  0.0850   889.400922

 

#將數據進行縱行合併

df = pd.concat([df1,df2,df3])
df
Out[7]: 
       機構  科室   就診人數     增長率          上期人數
0  第一人民醫院  內科  35188  0.0998  31994.908165
1  第一人民醫院  外科  28467  0.1127  25583.715287
2  第一人民醫院  婦科  35617  0.0850  32826.728111
0  第二人民醫院  外科   1981  0.0575   1873.286052
1  第二人民醫院  內科   1958  0.1471   1706.913085
2  第二人民醫院  婦科   1532  0.0850   1411.981567
0  第三人民醫院  外科   1780  0.1315   1573.133009
1  第三人民醫院  內科   1447  0.0104   1432.106097
2  第三人民醫院  婦科    965  0.0850    889.400922

#創建數據,進行橫向合併

w1 = pd.DataFrame({'內科':[865,897,798,958],
                   '外科':[86,98,75,69],
                   '婦科':[658,421,395,582]},
                   index=['第一醫院','第二醫院','第三醫院','第四醫院'])
w1
Out[8]: 
       內科  外科   婦科
第一醫院  865  86  658
第二醫院  897  98  421
第三醫院  798  75  395
第四醫院  958  69  582

w2 = pd.DataFrame({'兒科':[97,78,98],
                   '骨科':[86,98,69],
                   '婦科':[68,42,58]},
                   index=['第三醫院','第四醫院','中醫院'])
w2
Out[9]: 
      兒科  骨科  婦科
第三醫院  97  86  68
第四醫院  78  98  42
中醫院   98  69  58

w2 = pd.DataFrame({'兒科':[97,78,98],
                   '骨科':[86,98,69]},
                   index=['第三醫院','第四醫院','中醫院'])
w2
Out[10]: 
      兒科  骨科
第三醫院  97  86
第四醫院  78  98
中醫院   98  69

 

#how='inner'表示內連接

pd.merge(left=w1,right=w2,left_index=True,right_index=True,how='inner')
Out[11]: 
       內科  外科   婦科  兒科  骨科
第三醫院  798  75  395  97  86
第四醫院  958  69  582  78  98

 

#how='left'表示左連接

pd.merge(left=w1,right=w2,left_index=True,right_index=True,how='left')
Out[12]: 
       內科  外科   婦科    兒科    骨科
第一醫院  865  86  658   NaN   NaN
第二醫院  897  98  421   NaN   NaN
第三醫院  798  75  395  97.0  86.0
第四醫院  958  69  582  78.0  98.0

 

#how='right'表示右連接

pd.merge(left=w1,right=w2,left_index=True,right_index=True,how='right')
Out[13]: 
         內科    外科     婦科  兒科  骨科
第三醫院  798.0  75.0  395.0  97  86
第四醫院  958.0  69.0  582.0  78  98
中醫院     NaN   NaN    NaN  98  69

 

#how='outer'表示全連接

pd.merge(left=w1,right=w2,left_index=True,right_index=True,how='outer')
Out[14]: 
         內科    外科     婦科    兒科    骨科
中醫院     NaN   NaN    NaN  98.0  69.0
第一醫院  865.0  86.0  658.0   NaN   NaN
第三醫院  798.0  75.0  395.0  97.0  86.0
第二醫院  897.0  98.0  421.0   NaN   NaN
第四醫院  958.0  69.0  582.0  78.0  98.0

 

* 刪除全連接中含有null的值,相當於對數據集進行內連接操作

w3 =pd.merge(left=w1,right=w2,left_index=True,right_index=True,how='outer')
w3.dropna()
Out[15]: 
         內科    外科     婦科    兒科    骨科
第三醫院  798.0  75.0  395.0  97.0  86.0
第四醫院  958.0  69.0  582.0  78.0  98.0

二、對空值和重複值進行處理;

#合併數據進行數據去重

w4 = pd.concat([w3,w3])
print('數據集行數:',len(w4))
數據集行數: 10

w4_uniqe = w4.drop_duplicates()
print('剩餘數據行:',len(w4_uniqe))
w4_uniqe
剩餘數據行: 5
Out[17]: 
         內科    外科     婦科    兒科    骨科
中醫院     NaN   NaN    NaN  98.0  69.0
第一醫院  865.0  86.0  658.0   NaN   NaN
第三醫院  798.0  75.0  395.0  97.0  86.0
第二醫院  897.0  98.0  421.0   NaN   NaN
第四醫院  958.0  69.0  582.0  78.0  98.0

三、按條件篩選數據

#篩選符合條件的數據
w4.loc[(w4['內科']>800)&(w4['外科']>80),:]
Out[24]: 
         內科    外科     婦科  兒科  骨科
第一醫院  865.0  86.0  658.0 NaN NaN
第二醫院  897.0  98.0  421.0 NaN NaN
第一醫院  865.0  86.0  658.0 NaN NaN
第二醫院  897.0  98.0  421.0 NaN NaN

 

#按照大小對數據進行排序,ascending=False降序排序

w4_sort = w4_uniqe.sort_values('內科',ascending=False)
w4_sort
Out[25]: 
         內科    外科     婦科    兒科    骨科
第四醫院  958.0  69.0  582.0  78.0  98.0
第二醫院  897.0  98.0  421.0   NaN   NaN
第一醫院  865.0  86.0  658.0   NaN   NaN
第三醫院  798.0  75.0  395.0  97.0  86.0
中醫院     NaN   NaN    NaN  98.0  69.0

 

#按照大小對數據進行排序,ascending=True降序排序

w4_sort2 = w4_uniqe.sort_values('內科',ascending=True)
w4_sort2
Out[26]: 
         內科    外科     婦科    兒科    骨科
第三醫院  798.0  75.0  395.0  97.0  86.0
第一醫院  865.0  86.0  658.0   NaN   NaN
第二醫院  897.0  98.0  421.0   NaN   NaN
第四醫院  958.0  69.0  582.0  78.0  98.0
中醫院     NaN   NaN    NaN  98.0  69.0

 

四、分組

ks=pd.read_excel(r'F:\Python\科室數據.xlsx')
ks
Out[28]: 
    地區      機構  科室   就診人數     增長率          上期人數
0   北京  第一人民醫院  內科  35188  0.0998  31994.908165
1   天津  第一人民醫院  外科  28467  0.1127  25583.715287
2   上海  第一人民醫院  內科  13747  0.0254  13406.475522
3   深圳  第一人民醫院  外科   5183  0.0247   5058.065775
4   廣州  第一人民醫院  內科   4361  0.0431   4180.807209
5   北京  第二人民醫院  外科   4063  0.1157   3641.659944
6   天津  第二人民醫院  內科   2122  0.1027   1924.367462
7   上海  第二人民醫院  外科   2041  0.0706   1906.407622
8   深圳  第二人民醫院  內科   1991  0.1652   1708.719533
9   廣州  第二人民醫院  外科   1981  0.0575   1873.286052
10  北京  第三人民醫院  外科   1780  0.1315   1573.133009
11  天津  第三人民醫院  內科   1447  0.0104   1432.106097
12  上海  第三人民醫院  外科  39048  0.1160  34989.247312
13  深圳  第三人民醫院  內科   3316  0.0709   3096.460921
14  廣州  第三人民醫院  外科   2043  0.0504   1944.973343

 

#按條件進行統計

ks.groupby('地區').sum()
Out[29]: 
     就診人數     增長率          上期人數
地區                             
上海  54836  0.2120  50302.130455
北京  41031  0.3470  37209.701119
天津  32036  0.2258  28940.188845
廣州   8385  0.1510   7999.066605
深圳  10490  0.2608   9863.246229

 

#按條件對部分列進行分組統計
ks.groupby('地區')['就診人數','上期人數'].sum()
__main__:1: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
Out[31]: 
     就診人數          上期人數
地區                     
上海  54836  50302.130455
北京  41031  37209.701119
天津  32036  28940.188845
廣州   8385   7999.066605
深圳  10490   9863.246229

 

#as_index=False表示不將分組條件作爲索引列

ks.groupby('地區',as_index=False)['就診人數','上期人數'].sum()
__main__:1: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
Out[32]: 
   地區   就診人數          上期人數
0  上海  54836  50302.130455
1  北京  41031  37209.701119
2  天津  32036  28940.188845
3  廣州   8385   7999.066605
4  深圳  10490   9863.246229

 

#按照某列對數據進行分組,並打標籤
ks1 =ks.groupby('地區',as_index=False)['就診人數','上期人數'].sum()
pd.cut(x=ks1['就診人數'],bins=[0,10000,20000,30000,40000,50000,60000])
__main__:1: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
Out[34]: 
0    (50000, 60000]
1    (40000, 50000]
2    (30000, 40000]
3        (0, 10000]
4    (10000, 20000]
Name: 就診人數, dtype: category
Categories (6, interval[int64]): [(0, 10000] < (10000, 20000] < (20000, 30000] < (30000, 40000] < (40000, 50000] < (50000, 60000]]

ks['等級'] = pd.cut(x=ks['就診人數'],bins=[0,10000,20000,30000,40000],
                 right=False,labels=['D','C','B','A'])
ks
Out[35]: 
    地區      機構  科室   就診人數     增長率          上期人數 等級
0   北京  第一人民醫院  內科  35188  0.0998  31994.908165  A
1   天津  第一人民醫院  外科  28467  0.1127  25583.715287  B
2   上海  第一人民醫院  內科  13747  0.0254  13406.475522  C
3   深圳  第一人民醫院  外科   5183  0.0247   5058.065775  D
4   廣州  第一人民醫院  內科   4361  0.0431   4180.807209  D
5   北京  第二人民醫院  外科   4063  0.1157   3641.659944  D
6   天津  第二人民醫院  內科   2122  0.1027   1924.367462  D
7   上海  第二人民醫院  外科   2041  0.0706   1906.407622  D
8   深圳  第二人民醫院  內科   1991  0.1652   1708.719533  D
9   廣州  第二人民醫院  外科   1981  0.0575   1873.286052  D
10  北京  第三人民醫院  外科   1780  0.1315   1573.133009  D
11  天津  第三人民醫院  內科   1447  0.0104   1432.106097  D
12  上海  第三人民醫院  外科  39048  0.1160  34989.247312  A
13  深圳  第三人民醫院  內科   3316  0.0709   3096.460921  D
14  廣州  第三人民醫院  外科   2043  0.0504   1944.973343  D