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

Python pandas 数据清洗(二)

#创建数据,进行横向合并

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

Python pandas 数据清洗(二)

 

* 删除全连接中含有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

Python pandas 数据清洗(二)

二、对空值和重复值进行处理;

#合并数据进行数据去重

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

Python pandas 数据清洗(二)

三、按条件筛选数据

#筛选符合条件的数据
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

 

Python pandas 数据清洗(二)

四、分组

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

Python pandas 数据清洗(二)