分享一下近期用python做数据清洗汇总的相关代码。不得不说,python代码是真的非常友好,在R上可能就需要写好几句代码才能实现的功能,在python上可能就简单一句话。这里我们用到的python包有pandas、numpy、os等
数据读入与写出
csv
针对csv格式的数据,最简单的一种方法是用pandas中的read_csv方法,具体代码如下。其中第一个参数为待读入数据的路径,一个实用小技巧为./
表示当前文件夹,../
表示上层文件夹。这样如果待读入文件与代码文件在同一个文件夹下,可以节省掉很多层文件路径的输入。另外两个我较常用的参数为encoding和sep,其中encoding可指定数据UTF编码,sep为指定数据分隔符,默认为,
,但我经常遇到以\t
为分隔符的数据。如果你遇到了类似这样的报错ParserError: Error tokenizing data. C error: Expected 1 fields in line 57, saw 3
,可以考虑下是不是分隔符不对。
import pandas as pd
pd.read_csv('*.csv',encoding='gbk',sep='\t')
此外,有时候一个文件太大。其分别存储在不同文件中,甚至分开存储在不同文件夹下,这时就需考虑批量读取了。
在展示代码前,先介绍一下数据背景。现在我有一个叫obj的文件夹,其中存储了一系列以’job_id='开头的文件夹,在每个文件夹中又存储了一系列以’job_id='开头的csv的文件。这些文件存储的都是同一种数据,目前我的任务是读入这一批数据,并合并成一个数据框。
file_dir=glob.glob('./obj/job_id=*')
df = pd.DataFrame()
for i in file_dir:
file=glob.glob(os.path.join(i, "job_id=*.csv"))
file.sort()
a = pd.read_csv(file[0])
for f in file[1:]:
b = pd.read_csv(f,header=None)
b.columns = a.columns
a = pd.concat([a,b],ignore_index=True)
df = pd.concat([df,tmc],ignore_index=True)
glob.glob
:返回匹配的文件列表。
os.path.join
:拼接文件路径。
file.sort()
:对文件按文件名进行排序,主要我读取的文件,按文件名排序第一的文件数据有列名,其他文件没有列名,这里就需介绍一下pd.read_csv
的参数header
,若header=None
,则表明文件第一行非列名,否则将以列名读入python。
除了读入数据,另一个需要考虑的就是读出数据了。第一个参数指定读出的文件路径以及文件名。python中如果该文件已经存在,则直接覆盖。若