pandas典型应用
#header默认为0,即以第一列为列名,这里设为None,意味不设置第一行为列名; df11 = pd.read_table(url,header =None) df11.head() #names =***,可以自定义设置列名 user_cols = ['id','quantity','name','choice','price'] df= pd.read_table(url,header =None,names = user_cols) df.head() 查看行与列 df.shape#查看Dataframe的整体数据 #列出某一列的数据,为一个series数据 df['name']#也可以df.name print(type(df['name'])) 处理数据中时利用columns改变列名 #在Dataframe数据中更改列名,在每个列名后面加一个‘_’; df.columns = [str(i)+'_' for i in df.columns] df 利用drop函数删除特定的列 #pd.DataFrame去除某一列,用到的函数drop, # 第一个参数为单个标签或多个标签; # axis表示欲删除的为行或者列,0为行,1为列; # inplace =True,以及操作 df1 =df df1.drop(['name_','choice_'],axis = 1,inplace = True) df1.head() 利用map函数对列中数据格式进行变换 #对某一列数据进行修改;把price_中的$变成¥;利用lambda映射; df['price_'] = df['price_'].map(lambda x:str(x).replace('$','¥')) df to_csv将 Dataframe数据直接写到csv文件中 #将 Dataframe写出csv文件, # 第一个参数描述欲输出的文件名,若提供的为None,则返回的是string; # index表示行索引,默认为True, # header = True表示的是不保存列名。 # encoding = 'gbk',输入编码方式为gbk df.to_csv('E:/ceshi/ab.csv',index =False,header =True,encoding = 'gbk') converters 可以在读取的时候对列数据进行变换: pd.read_csv(file_path,encoding='gbk', converters={"编号": lambda x: int(x) + 10}) true_values和false_value 指定哪些值应该被清洗为True,哪些值被清洗为False。 pd.read_csv(file_path,encoding='gbk',true_values=["林克","奎托斯","褪色者","苇名弦一羊"],false_values=["马里奥"]) 注意这里的替换规则,只有当某一列的数据全部出现在true_values + false_values里面,才会被替换。例如执行以下内容,不会发生变化; skipfooter 从文件末尾过滤行,解析引擎退化为 Python。这是因为 C 解析引擎没有这个特性。 pd.read_csv(file_path,encoding='gbk',skipfooter=2,engine=“python”) skipfooter接收整型,表示从结尾往上过滤掉指定数量的行,因为引擎退化为python,那么要手动指定engine=“python”,不然会警告。 nrows nrows 参数设置一次性读入的文件行数,它在读入大文件时很有用,比如 16G 内存的PC无法容纳几百 G 的大文件。 pd.read_csv(file_path,encoding='gbk',nrows=4) na_values na_values 参数可以配置哪些值需要处理成 NaN,这个是非常常用的。 pd.read_csv(file_path,encoding='gbk',na_values=['马里奥','战神']) 我们看到将 ‘马里奥’ 和 ‘战神’ 设置成了NaN,当然我们这里不同的列,里面包含的值都是不相同的。但如果两个列中包含相同的值,而我们只想将其中一个列的值换成NaN该怎么做呢?通过字典实现只对指定的列进行替换。以下的例子可以看到,战神并没有被替换成NaN, 因为在角色里没有这个值;/ pd.read_csv(file_path,encoding='gbk',na_values={"角色":['马里奥','战神'],'编号':[2]}) 17. keep_default_na 我们知道,通过 na_values 参数可以让 pandas 在读取 CSV 的时候将一些指定的值替换成空值,但除了 na_values 指定的值之外,还有一些默认的值也会在读取的时候被替换成空值,这些值有: “-1.#IND”、“1.#QNAN”、“1.#IND”、“-1.#QNAN”、“#N/A N/A”、“#N/A”、“N/A”、“NA”、“#NA”、“NULL”、“NaN”、“-NaN”、“nan”、“-nan”、“” 。尽管这些值在 CSV 中的表现形式是字符串,但是 pandas 在读取的时候会替换成空值(真正意义上的 NaN)。不过有些时候我们不希望这么做,比如有一个具有业务含义的字符串恰好就叫 “NA”,那么再将它替换成空值就不对了。 这个时候就可以将 keep_default_na 指定为 False,默认为 True,如果指定为 False,那么 pandas 在读取时就不会擅自将那些默认的值转成空值了,它们在 CSV 中长什么样,pandas 读取出来之后就还长什么样,即使单元格中啥也没有,那么得到的也是一个空字符串。但是注意,我们上面介绍的 na_values 参数则不受此影响,也就是说即便 keep_default_na 为 False,na_values 参数指定的值也依旧会被替换成空值。举个栗子,假设某个 CSV 中存在 “NULL”、“NA”、以及空字符串,那么默认情况下,它们都会被替换成空值。但 “NA” 是具有业务含义的,我们希望保留原样,而 “NULL” 和空字符串,我们还是希望 pandas 在读取的时候能够替换成空值,那么此时就可以在指定 keep_default_na 为 False 的同时,再指定 na_values 为 ["NULL", ""] 18. na_filter 是否进行空值检测,默认为 True,如果指定为 False,那么 pandas 在读取 CSV 的时候不会进行任何空值的判断和检测,所有的值都会保留原样。因此,如果你能确保一个 CSV 肯定没有空值,则不妨指定 na_filter 为 False,因为避免了空值检测,可以提高大型文件的读取速度。另外,该参数会屏蔽 keep_default_na 和 na_values,也就是说,当 na_filter 为 False 的时候,这两个参数会失效。 从效果上来说,na_filter 为 False 等价于:不指定 na_values、以及将 keep_default_na 设为 False。 19. skip_blank_lines skip_blank_lines 默认为 True,表示过滤掉空行,如为 False 则解析为 NaN。 20. parse_dates 指定某些列为时间类型,这个参数一般搭配下面的date_parser使用。 21. date_parser 是用来配合parse_dates参数的,因为有的列虽然是日期,但没办法直接转化,需要我们指定一个解析格式: from datetime import datetime pd.read_csv(file_path,encoding='gbk',parse_dates=['发行日'],date_parser=lambda x:datetime.strptime(x,'%Y/%m/%d')) 22. infer_datetime_format infer_datetime_format 参数默认为 False。如果设定为 True 并且 parse_dates 可用,那么 pandas 将尝试转换为日期类型,如果可以转换,转换方法并解析,在某些情况下会快 5~10 倍。 23.iterator iterator 为 bool类型,默认为False。如果为True,那么返回一个 TextFileReader 对象,以便逐块处理文件。这个在文件很大、内存无法容纳所有数据文件时,可以分批读入,依次处理。 df=pd.read_csv(file_path,encoding='gbk',iterator=True) display(df.get_chunk(2)) """ 编号 角色 源于 发行日 0 1 马里奥 超级马里奥:奥德赛 2017/10/27 1 2 林克 塞尔达传说:荒野之息 2017/3/3 """ print(chunk.get_chunk(1)) """ 编号 角色 源于 发行日 2 3 奎托斯 战神 2018/4/20 """ # 文件还剩下三行,但是我们指定读取10,那么也不会报错,不够指定的行数,那么有多少返回多少 print(chunk.get_chunk(10)) """ 编号 角色 源于 发行日 3 4 褪色者 埃尔登法环 2022/2/25 4 5 苇名弦一羊 只狼 2019/3/22 """ try: # 但是在读取完毕之后,再读的话就会报错了 chunk.get_chunk(5) except StopIteration as e: print("读取完毕") # 读取完毕 24. chunksize chunksize 整型,默认为 None,设置文件块的大小。 chunk = pd.read_csv(file_path, sep="\t", chunksize=2) # 还是返回一个类似于迭代器的对象 # 调用get_chunk,如果不指定行数,那么就是默认的chunksize print(chunk.get_chunk()) """ 编号 角色 源于 发行日 0 1 马里奥 超级马里奥:奥德赛 2017/10/27 1 2 林克 塞尔达传说:荒野之息 2017/3/3 """ # 但也可以指定 print(chunk.get_chunk(100)) """ 编号 角色 源于 发行日 2 3 奎托斯 战神 2018/4/20 3 4 褪色者 埃尔登法环 2022/2/25 4 5 苇名弦一羊 只狼 2019/3/22 """ try: chunk.get_chunk(5) except StopIteration as e: print("读取完毕") # 读取完毕 25. compression compression 参数取值为 {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None},默认 ‘infer’,这个参数直接支持我们使用磁盘上的压缩文件。 # 直接将上面的.csv添加到压缩文件,打包成game_data.zip pd.read_csv('game_data.zip', compression="zip",encoding='gbk') 1 2 26. thousands 千分位分割符,如 , 或者 .,默认为None。 27. encoding encoding 指定字符集类型,通常指定为 ‘utf-8’。根据情况也可能是’ISO-8859-1’,本文中所有的encoding='gbk' ,主要原因为:我的数据是用Excel 保存成.CSV的,默认的编码格式为GBK; 28. error_bad_lines和warn_bad_lines 如果一行包含过多的列,假设csv的数据有5列,但是某一行却有6个数据,显然数据有问题。那么默认情况下不会返回DataFrame,而是会报错。 我们在某一行中多加了一个数据,结果显示错误。因为girl.csv里面有5列,但是有一行却有6个数据,所以报错。 在小样本读取时,这个错误很快就能发现。但是如果样本比较大、并且由于数据集不可能那么干净,会很容易出现这种情况,那么该怎么办呢?而且这种情况下,Excel基本上是打不开这么大的文件的。这个时候我们就可以将error_bad_lines设置为False(默认为True),意思是遇到这种情况,直接把这一行给我扔掉。同时会设置 warn_bad_lines 设置为True,打印剔除的这行。 pd.read_csv(file_path,encoding='gbk',error_bad_lines=False, warn_bad_lines=True)