在数据分析中,我们一般不会像前几篇那样自己创建数据,而是需要使用外部数据。本文将解决两个问题:如何导入外部数据并将其转换为DataFrame?如何将DataFrame导出为常见的文件格式?4.1读取文本数据本文使用的数据可以从GitHub下载:https://github.com/wesm/pydat...4.1.1csv数据:我们可以从csv数据入手,对表头行进行处理,见查看如何将csv数据导入为DataFrame:in:df=pd.read_csv('examples\ex1.csv')dfout:abcdmessage01234hello15678world29101112foo如果你使用如果你使用的是PyCharmIDE,查看Console中的变量部分,在变量“df”的右侧会有一个“viewasDataFrame”按钮。点击它,可以看到这样一个视图:这个视图在数据量很大的时候非常有用,可以帮助你粗略的查看数据。除了pd.read_csv(),pandas还提供了读取其他形式数据的方法,如pd.read_table()、pd.read_json()、pd.read_excel()等。pd.read_table('examples\ex1.csv',sep=',')#由于pd.read_table()的默认分隔符是tab,如果文件没有header,我们需要手动指定它来打开我们的文件row(字段名/列名),怎么办?in:pd.read_csv('examples\ex2.csv')out:1234hello#可以看到,pandas默认认为第一行是标题行,这与我们想要的结果不一致05678world19101112fooin:pd.read_csv('examples\ex2.csv',header=None)#这允许pandas不将第一行视为标题行out:01234#pandas默认生成一行连续的数字作为标题行01234hello15678world29101112fooin:pd.read_csv('examples\ex2.csv',names=['a','b','c','d','message'])#你可以像这样给每一列起一个名字:abcdmessage01234hello15678world29101112fooin:pd.read_csv('examples\ex2.csv',names=['a','b','c','d','message'],index_col='message')#你可以还使用消息列作为DataFrame索引的行:abcdmessagehello1234world5678foo91011124.1.2txt数据:处理分隔符的csv数据相对比较规整,那么如何读取txt数据呢?我们来看一个txt数据的例子:in:withopen('examples\ex3.txt','r')asf:#这样就可以用普通的python方法打开一个txt文件print(f.read()出局:ABCAAA-0.264438-1.026059-0.619500BBB0.9272720.302904-0.032399CCC-0.264273-0.386314-0.386314-0.217601dd-dd-0.8718718718718718.8718-8718718.8718.8718718.8718.8718.8718.8718.8718.8718.87.8718-18-87.87.8718-18-87.87.8718-187.87.8718nymanternythertemt)#换种方式看出来:['ABC\n','aaa-0.264438-1.026059-0.619500\n','bbb0.9272720.302904-0.032399\n','ccc-0.264273-0.386314-0.217,601\n''ddd-0。-0.3483821.100491\n']#可以看到这个txt文件里面全是分隔符,分隔符包括:单个空格,多个空格和换行符现在让我们将这个txt数据导入为DataFrame:in:df=pd.read_table('示例\ex3.txt')dfout:abc0AAA-0.264438-1.026059-0.6195001BBB0.9272720.302904-0.0323992CCC-0.264273-0.386314-09314-014-014.6314-014.6314.6314.63176.6314.63176ddddddddddgoingisfinein:df.columns#但是如果我们看它的列标签,就知道这不是我们想要的结果out:Index(['ABC'],dtype='object')有上面的问题原因就是不同的分隔符导致pandas难以识别行列分隔。如何解决这个问题呢?我们可以像前面说的那样指定sep参数,让pandas识别分隔符。但是分隔符包括单个空格、多个空格和换行符,这三个分隔符如何表示?我们使用正则表达式:#这里使用正则表达式:\s代表空格和换行,+代表加号前的一个或多个字符——即多个空格在:df=pd.read_table('examples\ex3.txt',sep='\s+')df.columnsout:Index(['A','B','C'],dtype='object')#这次就是我们要的结果是4.1.3跳过表格的前几行有些人在写表格的时候喜欢在表格的前几行注明一些信息。我们需要跳过无意义的评论。例如这个文件“examples\ex4.csv”:#嘿!a,b,c,d,message#只是想让事情变得更困难#谁用电脑读取CSV文件,无论如何?1,2,3,4,hello5,6,7,8,world9,10,11,12,foo我们要跳过无意义的1、3、4行,只需要指定skiprows参数即可:in:pd.read_csv('examples\ex4.csv',skiprows=[0,2,3])out:abcdmessage01234hello15678world29101112foo4.1.4excel数据常用软件为Excel,保存的表格文件通常是xlsx文件。我最常用的打开这类数据的方式是:path=r'adata.xlsx'df=pd.read_excel(path,engine='openpyxl',dtype=object,keep_default_na=False)我来解释一下pd。我在read_excel()中使用的参数:Excelxlsx文件;notsupported之前已经出现过-本文描述的错误,所以我一般在导入xlsx文件时将engine参数设置为'openpyxl''。但似乎不再需要了。如果dtype设置为object,则可以保留数据的原始外观。keep_default_na=False不需要设置缺失值为NaN4.1.5缺失值处理我们来看一个缺失值的数据:in:pd.read_csv('examples\ex5.csv')out:somethingabcdmessage0one123.04NaN#可以看到,里面包含缺失值1二56NaN8world2三91011.012foo同样,设置keep_default_na=False。如果除了空值之外,还有一些其他值(比如foo)也代表缺失值,我们希望等于foo的值也显示为NaN:in:pd.read_csv('examples\ex5.csv',na_values=['foo'])out:somethingabcdmessage0one123.04NaN1two56NaN8world2three91011.012NaN4.1.6JSON数据我们在处理从网上爬取的数据时,往往需要处理JSON数据。例如:in:obj="""{"name":"Wes","places_lived":["UnitedStates","Spain","Germany"],"pet":null,"siblings":[{"name":"Scott","age":30,"pets":["Zeus","Zuko"]},{"name":"Katie","age":38,"pets":["Sixes","Stache","Cisco"]}]}"""#我们定义一个JSON数据obj#我们得到一个JSON格式的字符串out:'\n{"name":"Wes",\n"places_lived":["美国","西班牙","德国"],\n"pet":null,\n"siblings":[{"name":"Scott","age":30,"pets":["Zeus","Zuko"]},\n{"name":"Katie","age":38,\n"pets":["Sixes","Stache","Cisco"]}]\n}\n'为了能够处理这个JSON字符串,我们需要将它转换为Python字典形式:in:importjsonresult=json.loads(obj)#我们通过json.loads()result#可以看到现在变成了字典out:{'name':'Wes','places_lived':['美国','西班牙','德国'],'pet':None,'siblings':[{'name':'Scott','age':30,'pets':['Zeus','Zuko']},{'name':'Katie','age':38,'pets':['Sixes','Stache','Cisco']}]}现在,这些数据可以转换到DataFrame并处理:in:pd.DataFrame(result['siblings'])#passindictionarylistout:nameagepets0Scott30[Zeus,Zuko]1Katie38[Sixes,Stache,Cisco]in:pd.DataFrame(result['siblings'],columns=['name','age'])out:nameage0Scott301Katie38Python字典也可以转回JSON字符串:in:json.dumps(result)#我们通过json.dumps()转换出来:'{"name":"Wes","places_lived":["UnitedStates","Spain","Germany"],"pet":null,"siblings":[{"name":"Scott","age":30,"pets":["Zeus","Zuko""]},{"name":"Katie","age":38,"pets":["Sixes","Stache","Cisco"]}]}'当然pandas也可以直接读取JSON文件,但json文件的格式要整齐in:pd.read_json('examples/example.json')out:abc0123145627894.2逐块读取文本数据处理大文件时,通常我们希望阅读其中的一小部分。比如这个有10000行数据的文件:#为了显示的好看,我们先让pandas在显示的时候只显示10行pd.options.display.max_rows=10#让pandas在显示的时候只显示10行:df=pd.read_csv('examples/ex6.csv')dfout:onetwothreefourkey00.467976-0.038649-0.295344-1.824726L1-0.3588931.4044530.704965-0.200638B2-0.5018400.659254-0.421691-0.057688G30.2048861.0741341.388361-0.982404R40.354628-0.1331160.283763-0.837063Q..............99952.311896-0.417070-1.409599-0.515821L9996-0.479893-0.6504190.745152-0.646038E99970.5233310.7871120.4860661.093156K9998-0.3625590.598894-1.8432010.887292G9999-0.096376-1.012999-0.657431-0.5733150[10000行x5列]为了逐块读取文件,我们需要指定块大小。例如,我们读取1000行的块。chunker=pd.read_csv('examples/ex6.csv',chunksize=1000)#这个东西是一个迭代器tot=pd.Series([])forpieceinchunker:#这个可以一块一块处理tot=tot.add(piece['key'].value_counts(),fill_value=0)4.3导出数据表格数据通常导出为csv或xlsx文件。这个可以导出:data=pd.read_csv('examples/ex5.csv')#首先我们读取一个文件path=r"afile.csv"data.to_csv(path)#这会导出path=r"Afile.xlsx"data.to_excel(path,index=False)#设置index为False不输出索引注:转载请注明出处。本文属于《利用 Python 进行数据分析》读书笔记系列:Python数据分析——1数据结构、函数与文件Python数据分析——2NumPy基础Python数据分析——3pandas入门
