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進行分組
加載包
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