首页 > 分享 > Python pandas 数据清洗(二)

Python pandas 数据清洗(二)

关注微信公共号:小程在线

关注CSDN博客:程志伟的博客

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

相关知识

使用Python实现深度学习模型:智能旅游路线规划
【创新课题】猫狗养殖户养殖决策系统:基于python爬虫猫狗电商销售数据可视化分析
机器学习之数据预处理(Python 实现)
宝可梦数据集分析及预测
社交媒体数据分析的可视化展示:让数据讲述故事
探索性数据分析—赛事数据集(Ⅰ)
通过数据分析如何优化运动训练计划?
使用Python实现深度学习模型:用户行为预测与个性化服务
python 批量读取excel
第三届泰迪杯数据挖掘技能赛一等奖总结&经验分享

网址: Python pandas 数据清洗(二) https://m.mcbbbk.com/newsview475120.html

所属分类:萌宠日常
上一篇: 蛋白棉的清洗方法
下一篇: QQ西游宠物技能应该如何选择