importnumpyasnpimportpandasaspdstarbucks=pd.read_csv("D:\\directory.csv")print"数据的列标签如下:"printstarbucks.columnsprint"每列的数据类型:"printstarbucks.dtypesprint"文件行数:"printlen(starbucks.index)print"文件列数:"printstarbucks.columns.size输出:
数据的列标签如下:Index([u'Brand',u'StoreNumber',u'StoreName',u'OwnershipType',u'StreetAddress',u'City',u'State/Province',u'Country',u'Postcode',u'PhoneNumber',u'Timezone',u'Longitude',u'Latitude'],dtype='object')每列的数据类型:BrandobjectStoreNumberobjectStoreNameobjectOwnershipTypeobjectStreetAddressobjectCityobjectState/ProvinceobjectCountryobjectPostcodeobjectPhoneNumberobjectTimezoneobjectLongitudefloat64Latitudefloat64dtype:object文件行数:25600文件列数:13可以看到文件共有25600条数据,每条数据有13列。
要实现这个功能需要用到DataFrame.groupby()函数,相当于sql中的groupby。在本例中可以使用starbucks.groupby(["Country"])来对星巴克按国家分组,然后使用starbucks.groupby(["Country"]).size()求得每个国家有多少星巴克。
df=starbucks.groupby(["Country"]).size().reset_index()输出:
CountryAD1AE144AR108AT18AU22AW3AZ4BE19BG5BH21BN5BO4BR102BS10CA1468CH61CL96CN2734CO11CR11CW3CY10CZ28DE160DK21EG31ES101FI8FR132GB901...LU2MA9MC2MX579MY234NL59NO17NZ24OM12PA5PE89PH298PL53PR24PT11QA18RO27RU109SA102SE18SG130SK3SV11TH289TR326TT3TW394US13608VN25ZA3Length:73,dtype:int64然后我们将上一步的结果使用reset_index()方法封装成一个新的DataFrame,然后对这个DataFrame排序即可。
#根据每个国家的国家名和星巴克数量重建为一个DataFramedf=starbucks.groupby(["Country"]).size().reset_index()#查看df的前5行数据printdf.head()#修改列名(将“0”改为“Nums”)df.columns=["Country","Nums"]#按照星巴克数量由多到少对国家排序df.sort_values(by=["Nums"],ascending=False).head()输出:
Country00AD11AE1442AR1083AT184AU22CountryNums70US1360817CN273414CA146837JP123739KR993可以看到,美国的星巴克最多,有13608家,其次是中国、加拿大、日本、韩国。由于篇幅限制只显示了排序后的5行,可以去掉head()显示全部数据。
首先要在所有国家的数据中选择中国的数据,可以使用布尔索引实现这一目的:
#选择中国的数据df=starbucks[starbucks["Country"]=="CN"]#统计每个城市的星巴克数量df.groupby(["City"]).size()输出:
CityAdmiralty2CausewayBay5Central1Chaiwan1Changshu1Changzhou1FortressHill1Hangzhou2HongKong104Jiaxing2Jinhua1Kowloon19KowloonBay1KowloonTong1LantauIsland2Macau13MongKok2N.T.2Nanjing1Nantong4NewTerritories7Ningbo3QuarryBay3ShangHai2Shanghai2Shantin1Stanley1Suzhou3TaiKooShing1TinHau1...萧山市1蚌埠市1衡阳市3衢州市3襄樊市1襄阳市2西宁市3西安市40诸暨市2贵阳8贵阳市1连云港1连云港市3邢台市1邯郸1郑州市18重庆市41金华市11银川市2镇江市9长春市10长沙市26阳江市1青岛市28靖江市2鞍山市3马鞍山3高邮市1黄石市1龙岩市2Length:197,dtype:int64可以看到数据不是很规范,城市名称既有中文又有英文,而且上海被存储为ShangHai和Shanghai。对于上海的问题,我们将拼音全部改为小写即可;对于中文和拼音混用的问题,可以使用相应的python库(如库pinyin)将中文转换为拼音后作统计。首先安装库pinyin,如果是在命令行里运行的python,直接pipinstallpinyin,安装成功后importpinyin即可。我是在jupyternotebook里面写的,外部pip安装的模块无法导入,所以使用下面的方法(或者使用conda命令安装):
importpippip.main(['install','pinyin'])安装后导入并做相应的处理:
importpinyin#选择中国的数据df=starbucks[starbucks["Country"]=="CN"]#需要拷贝一下,不然会出现“AvalueistryingtobesetonacopyofaslicefromaDataFrame.”的警告df1=df.copy()#将城市名改为小写df1["City"]=df1["City"].apply(lambdax:x.lower())df2=df1.copy()#将汉字城市名改为小写拼音df2["City"]=df2["City"].apply(lambdax:pinyin.get(x,format="strip",delimiter="")[0:-3])#去掉“市”的拼音#统计每个城市的星巴克数量df2.groupby(["City"]).size()输出:
Cityadmira2anshan3bangbu1baoding3baoji1baotou4beihai1beijing234causeway5cent1chai1chang1changchun10changsha26changshu6changz1changzhou26chengde1chengdu98cixi5dali1dalian25danzhou1daqing2deyang2dezhou2dongguan31dongyang1dongying1fenghua2...yancheng6yangjiang1yangzhong1yangzhou12yanji1yantai8yichang4yinchuan2yingkou2yiwu2yixing3yuenl2yueyang2yuyao1zhangjia1zhangjiag1zhangjiagang1zhangzhou1zhanjiang4zhaoqing1zhengzhou18zhenjiang9zhongqing41zhongshan11zhous1zhoushan5zhuhai14zhuji2zhuzhou2zibo5Length:192,dtype:int64这里使用到了DataFrame.apply(func)方法,该方法将函数func应用到整个DataFrame上,也可以通过指定axis参数来指定每一行或每一列的数据应用函数func。接下来使用reset_index方法将上一步得到的数据封装到一个新的DataFrame中排序即可。
df3=df2.groupby(["City"]).size().reset_index()#更改列索引名称df3.columns=["City","Nums"]printdf3.sort_values(by=["Nums"],ascending=False).head()输出:
CityNums121shanghai5427beijing23446hangzhou117126shenzhen11336guangzhou106可以看到在中国,上海的星巴克最多,有542家,其次的是北京、杭州、深圳和广州,去掉.head()可以查看所有城市的数据。
本文主要按照星巴克数量对国家和中国的城市进行排序,用到的知识有:
我们也可以看到一些pandas的操作可以与SQL操作练习起来:
在上文中我们使用布尔索引选择了中国的数据df=starbucks[starbucks["Country"]=="CN"],这一点很像SQL里面的where语句select*fromstarbuckswhereCountry="CN"。
starbucks有很多列,如Country,City,Brand,Postcode等,如果我们要从所有列中选择两列Country和City,则pandas可以使用df=starbucks[["Country","City"]],与之对应的是SQL中的select语句selectCountry,Cityfromstarbucks;
上文中通过国家分组,pandas使用DataFrame.groupby()方法starbucks.groupby(["Country"]),对应的为SQL中的select*fromstarbucksgroupbyCountry。