Pandas库的学习

Posted 木白星枝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas库的学习相关的知识,希望对你有一定的参考价值。

pandas是数据处理最常用的分析库之一,可以读取各种各样格式的数据文件,一般输出dataframe格式。
如:txt、csv、excel、json、剪切板、数据库、html、hdf、parquet、pickled文件、sas、stata等等

一.读取文件的方法

1.read_csv方法

read_csv方法用来读取csv格式文件,输出dataframe格式。

1.1 filepath_or_buffer(读取csv文件

#filepath_or_buffer读取csv文件,可以是文件路径,也可以是一个URL,如果访问该URL会返回一个文件的话,那么pandas的read_csv函数会自动将该文件进行读取。

import pandas as pd
file_path=r'D:\\pythonProject\\数学建模\\data\\1\\附件1 弱覆盖栅格数据(筛选).csv'#'test.csv'
content=pd.read_csv(file_path)

1.2 header和names(列名称和列索引、从第几行开始)

#header设置导入 DataFrame 的列名称,默认为 "infer"
#names:当names没被赋值时,header会变成0,即选取数据文件的第一行作为列名。
#当 names 被赋值,header 没被赋值时,那么header会变成None。如果都赋值,就会实现两个参数的组合功能。

content=pd.read_csv(file_path, header=1)#从第2行开始
content=pd.read_csv(file_path, header=None)
#认为原始文件数据没有列索引,为其自动加上列索引从0开始
content=pd.read_csv(file_path, names=["1", "2", "3"])#在原csv上面加上names数据这1行
content=pd.read_csv(file_path, names=range(1,4), header=0)
#从第1行开始,并把第1行替换成names数组

1.3 usecols(提取需要的列)

#usecols选择想要提取的列,选择列名的长度大于 4 的列:usecols=lambda x: len(x) > 4

content=pd.read_csv(file_path, usecols=["x", "y"])

1.4 index_col(选择哪一列作为索引)

content=pd.read_csv(file_path, index_col=2)#将第一列作为索引index

# index_col='y',将"y"这一列作为索引即行索引后,"y"这列即不在属于列名这类,即不能使用df['y']获取列值
# read_csv()方法中header参数和index_col参数不能混用,因为header指定列索引,index_col指定行索引,一个DataFrame对象只有一种索引

1.5 dtype(列类型)

#dtype来指定某个列的类型

content=pd.read_csv(file_path, dtype="x": str,'y':str)#dtype来指定某个列的类型
content["x"] = content["x"] * 3

1.6 converters(列数据变换)

#converters可以在读取的时候对列数据进行变换,好像也可以指定数据类型
#使用converters参数时,解析器默认所有列的类型为 str,所以需要显式类型转换
content=pd.read_csv(file_path, converters="id": lambda x: int(x) + 10)

1.7 true_values和false_values (数据清洗)

# true_values和false_value指定哪些值应该被清洗为True,哪些值被清洗为False
# 只有当某一列的数据全部出现在true_values + false_values里面,才会被替换
content=pd.read_csv(file_path, true_values=["对"], false_values=["错"])
content=pd.read_csv(file_path, false_values=["错", "对"])

1.8 skiprows(过滤行)

# skiprows 表示过滤行,想过滤掉哪些行,先过滤,然后再确定表头
content=pd.read_csv(file_path,skiprows=[0])
content=pd.read_csv(file_path, skiprows=lambda x: x > 0 and x % 2 == 0)

1.9 skipfooter(过滤结尾)

# skipfooter:接收整型,表示从结尾往上过滤掉指定数量的行,解析引擎退化为 Python。这是因为 C 解析引擎没有这个特性。
content=pd.read_csv(file_path, skipfooter=3, encoding="utf-8", engine="python")

1.10 nrows(一次性读入行数)

#nrows 设置一次性读入的文件行数
# 它在读入大文件时很有用,比如 16G 内存的PC无法容纳几百 G 的大文件。很多时候我们只是想看看大文件内部的字段长什么样子
content=pd.read_csv(file_path, nrows=1)

1.11 na_values(处理成NaN)

# na_values 参数可以配置哪些值需要处理成 NaN,针对整个csv中的全部数据,下面是只对指定的列进行替换
content=pd.read_csv(file_path, na_values=["对", "古明地觉"])
content=pd.read_csv(file_path, sep="\\t", na_values="x": ["古明地觉", "博丽灵梦"], "y": ["对"])

1.12 keep_default_na(默认转换为NaN的值不转换)

# 除了 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 在读取时就不会擅自将那些默认的值转成空值了
# 但是na_values 参数指定的不受此影响,还是会转换成NAN
content=pd.read_csv(file_path, na_values=["", "NULL"],keep_default_na=False)

 1.13 na_filter和skip_blank_lines(空值监测、过滤空行)

# na_filter指定为 False,那么 pandas 在读取 CSV 的时候不会进行任何空值的判断和检测,所有的值都会保留原样。
# 因此,如果你能确保一个 CSV 肯定没有空值,则不妨指定 na_filter 为 False,因为避免了空值检测,可以提高大型文件的读取速度。
# 另外,该参数会屏蔽 keep_default_na 和 na_values,也就是说,当 na_filter 为 False 的时候,这两个参数会失效。

# skip_blank_lines 默认为 True,表示过滤掉空行,如为 False 则解析为 NaN。
# 也可以指定 keep_default_na 为 False 来改变这一点
content=pd.read_csv(file_path, na_filter=False,skip_blank_lines=False)

1.14 parse_dates和date_parser和infer_datetime_format(和keep_date_col 和dayfirst)(时间转换)

# parse_dates,指定某些列为时间类型,这个参数一般搭配下面的date_parser使用。
# date_parser是用来配合parse_dates参数的,因为有的列虽然是日期,但没办法直接转化,需要我们指定一个解析格式:
# infer_datetime_format 参数默认为 False。如果设定为 True 并且 parse_dates 可用,
# 那么 pandas 将尝试转换为日期类型,如果可以转换,转换方法并解析,在某些情况下会快 5~10 倍。
from datetime import datetime
content=pd.read_csv(file_path, sep="\\t", parse_dates=["date"], date_parser=lambda x: datetime.strptime(x, "%Y年%m月%d日"))
# keep_date_col : boolean, default False
# 如果连接多列解析日期,则保持参与连接的列。默认为False。
#
# date_parser : function, default None
# 用于解析日期的函数,默认使用dateutil.parser.parser来做转换。Pandas尝试使用三种不同的方式解析,如果遇到问题则使用下一种方式。
# 1.使用一个或者多个arrays(由parse_dates指定)作为参数;
# 2.连接指定多列字符串作为一个列作为参数;
# 3.每行调用一次date_parser函数来解析一个或者多个字符串(由parse_dates指定)作为参数。

# dayfirst : boolean, default False
# DD/MM格式的日期类型

 

1.15 iterator(处理大文件)

# 分块读入内存,尤其单机处理大文件时会很有用。
# iterator 为 bool类型,默认为False。如果为True,那么返回一个 TextFileReader 对象,以便逐块处理文件。
# 这个在文件很大、内存无法容纳所有数据文件时,可以分批读入,依次处理。
chunk = pd.read_csv(file_path, iterator=True)
print(chunk)  # <pandas.io.parsers.TextFileReader object at 0x000002550189C0A0>

print(chunk.get_chunk(1))#依次从剩余的数据中读取前1行
print(chunk.get_chunk(2))#依次从剩余的数据中读取前2行
# 文件还剩下三行,但是我们指定读取100,那么也不会报错,不够指定的行数,那么有多少返回多少
print(chunk.get_chunk(100))
try:
    # 但是在读取完毕之后,再读的话就会报错了
    chunk.get_chunk(5)
except StopIteration as e:
    print("读取完毕")
# 读取完毕

1.16 chunksize(文件块)

# chunksize 整型,默认为 None,设置读取文件块的大小。
chunk = pd.read_csv(file_path, chunksize=2)
# 还是返回一个类似于迭代器的对象
print(chunk)  # <pandas.io.parsers.TextFileReader object at 0x0000025501143AF0>
# 调用get_chunk,如果不指定行数,那么就是默认的chunksize
print(chunk.get_chunk())
# 但也可以指定
print(chunk.get_chunk(100))
try:
    chunk.get_chunk(5)
except StopIteration as e:
    print("读取完毕")
# 读取完毕

1.17 compression(读取压缩文件等)

# compression 参数取值为 'infer', 'gzip', 'bz2', 'zip', 'xz', None,默认 'infer',这个参数直接支持我们使用磁盘上的压缩文件。
# 直接将上面的girl.csv添加到压缩文件,打包成girl.zip
content=pd.read_csv('girl.zip', sep="\\t", compression="zip")

 1.18 error_bad_lines和warn_bad_lines(处理某一行多一个数据)

# error_bad_lines和warn_bad_lines 两参数只能在C解析引擎下使用。
# 如果一行包含过多的列,假设csv的数据有5列,但是某一行却有6个数据,数据有问题。那么默认情况下不会返回DataFrame,而是会报错。
# 这时,我们就可以将error_bad_lines设置为False(默认为True),遇到这种情况,直接把这一行扔掉。同时会设置 warn_bad_lines 设置为True,打印剔除的这行。
content=pd.read_csv(file_path, error_bad_lines=False, warn_bad_lines=True)

1.19  sep、delimiter、delim_whitespace(分隔符)

# sep读取csv文件时指定的分隔符,默认为逗号
# sep : str , default','分隔符长于一个字符并且不是‘\\s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:'\\r\\t'
# **这里补充说明一下‘\\s+’
# 正则表达式中\\s匹配任何空白字符,包括空格、制表符、换页符等等, 等价于[ \\f\\n\\r\\t\\v]
#     \\f -> 匹配一个换页
#     \\n -> 匹配一个换行符
#     \\r -> 匹配一个回车符
#     \\t -> 匹配一个制表符
#     \\v -> 匹配一个垂直制表符
#     而“\\s+”则表示匹配任意多个上面的字符。

# delimiter定界符,备选分隔符,与 sep 功能相似(如果指定该参数,则sep参数失效)

# delim_whitespace设置为 True 时,表示分割符为空白字符,可以是空格、"\\t"等等,等效于设定sep='\\s+'。不管分隔符是什么,只要是空白字符,那么可以通过delim_whitespace=True进行读取。如果这个参数设定为Ture那么delimiter 参数失效。

1.20 mangle_dupe_cols(重名列的处理)

# 实际生产用的数据会很复杂,有时导入的数据会含有重名的列。参数 mangle_dupe_cols 默认为 True,重名的列导入后面多一个 .1。如果设置为 False,会抛出不支持的异常

1.21 prefix(列名前缀)

# prefix 参数,当导入的数据没有 header 时,设置此参数会自动加一个前缀。比如:
content=pd.read_csv(file_path, header=None, prefix="x")
#生成的列的名称是x0,x1,x2...不指定prefix就是0,1,2...

1.22 squeeze(返回Series)

# squeeze参数为True的话,在只有一列的情况下,那么得到就是一个Series

1.23 engine(数据引擎)

# engine指定pandas解析数据时用的引擎,pandas 目前的解析引擎提供两种:c、python,默认为 c,因为 c 引擎解析速度更快,但是特性没有 python 引擎全。如果使用 c 引擎没有的特性时,会自动退化为 python 引擎。

1.24 low_memory

# low_memory这个看起来是和内存有关的,但更准确的说,其实它是和数据类型相关的。在解释这个原因之前,我们还要先从DataFrame的数据类型说起。
# 我们知道DataFrame的每一列都是有类型的,那么在读取csv的时候,pandas也是要根据数据来判断每一列的类型的。但pandas主要是靠"猜"的方法,因为在读取csv的时候是分块读取的,每读取一块的时候,会根据数据来判断每一列是什么类型;然后再读取下一块,会再对类型进行一个判断,得到每一列的类型,如果得到的结果和上一个块得到结果不一样,那么就会发出警告,提示有以下的列存在多种数据类型:
# DtypeWarning: Columns (1,5,8,......) have mixed types. Specify dtype option on import or set low_memory=False.
# 而为了保证正常读取,那么会把类型像大的方向兼容,比如第一个块的user_id被解析成整型,但是在解析第二个块发现user_id有的值无法解析成整型,那么类型整体就会变成字符串,于是pandas提示该列存在混合类型。
# 而一旦设置low_memory=False,那么pandas在读取csv的时候就不分块读了,而是直接将文件全部读取到内存里面,这样只需要对整体进行一次判断,就能得到每一列的类型。但是这种方式也有缺陷,一旦csv过大,就会内存溢出。
# 不过从数据库读取就不用担心了,因为数据库是规定了每一列的类型的。如果是从数据库读取得到的DataFrame,那么每一列的数据类型和数据库表中的类型是一致的。还有,我们在上面介绍了dtype,这个是我们手动规定类型,那么pandas就会按照我们规定的类型去解析指定的列,但是一旦无法解析就会报错。

1.25 memory_map

# memory_map如果你知道python的一个模块mmap,那么你肯定很好理解。如果使用的数据在内存里,那么直接进行映射即可,直接map文件使用,不会(可以避免文件)再次进行IO操作,默认为False。这个参数比较底层,我们一般用不到。

1.26 verbose

# verbose=True:打印一些额外信息

1.27 thousands

# thousands 千分位分割符,如 , 或者 .,默认为None。

1.28 encoding

# encoding 指定字符集类型,通常指定为 'utf-8'。根据情况也可能是'ISO-8859-1'

1.29 skipinitialspace

# skipinitialspace=True忽略分隔符后的空白(默认为False,即不忽略).

2.read_excel方法

read_excel 读取excel文件,包括xlsx、xls、xlsm格式

2.1 io(读取excel文件

#io为文件类对象,一般作为读取文件的路径,默认读取第一个表
import pandas as pd
file_path=r'D:\\pythonProject\\数学建模\\data\\a.xlsx'
# 为方便演示函数效果这里创建一个excel文件,其中创建了两个表格:
excel=pd.read_excel(file_path, header=None) 

2.2

import pandas as pd

file_path=r'D:\\pythonProject\\数学建模\\data\\1\\附件1 弱覆盖栅格数据(筛选).csv'#'test.csv'
content=pd.read_csv(file_path)#读取csv文件,可以是文件路径,也可以是一个URL,如果访问该URL会返回一个文件的话,那么pandas的read_csv函数会自动将该文件进行读取。

#header设置导入 DataFrame 的列名称,默认为 "infer"
#names:当names没被赋值时,header会变成0,即选取数据文件的第一行作为列名。
# 当 names 被赋值,header 没被赋值时,那么header会变成None。如果都赋值,就会实现两个参数的组合功能。
content=pd.read_csv(file_path, header=1)#从第2行开始
content=pd.read_csv(file_path, header=None)#认为原始文件数据没有列索引,为其自动加上列索引从0开始

content=pd.read_csv(file_path, names=["1", "2", "3"])#在原csv上面加上names数据这1行
content=pd.read_csv(file_path, names=range(1,4), header=0)#从第1行开始,并把第1行替换成names数组

content=pd.read_csv(file_path, usecols=["x", "y"])#usecols选择想要提取的列,选择列名的长度大于 4 的列:usecols=lambda x: len(x) > 4

content=pd.read_csv(file_path, index_col=2)#将第一列作为索引index
# index_col='y',将"y"这一列作为索引即行索引后,"y"这列即不在属于列名这类,即不能使用df['y']获取列值
# read_csv()方法中header参数和index_col参数不能混用,因为header指定列索引,index_col指定行索引,一个DataFrame对象只有一种索引

content=pd.read_csv(file_path, dtype="x": str,'y':str)#dtype来指定某个列的类型
content["x"] = content["x"] * 3

content=pd.read_csv(file_path, converters="id": lambda x: int(x) + 10)#converters可以在读取的时候对列数据进行变换,好像也可以指定数据类型
#使用converters参数时,解析器默认所有列的类型为 str,所以需要显式类型转换

content=pd.read_csv(file_path, true_values=["对"], false_values=["错"])
content=pd.read_csv(file_path, false_values=["错", "对"])
# true_values和false_value指定哪些值应该被清洗为True,哪些值被清洗为False
# 只有当某一列的数据全部出现在true_values + false_values里面,才会被替换


content=pd.read_csv(file_path,skiprows=[0])
content=pd.read_csv(file_path, skiprows=lambda x: x > 0 and x % 2 == 0)
# skiprows 表示过滤行,想过滤掉哪些行,先过滤,然后再确定表头

content=pd.read_csv(file_path, skipfooter=3, encoding="utf-8", engine="python")
# skipfooter:接收整型,表示从结尾往上过滤掉指定数量的行,解析引擎退化为 Python。这是因为 C 解析引擎没有这个特性。

content=pd.read_csv(file_path, nrows=1)#nrows 设置一次性读入的文件行数
# 它在读入大文件时很有用,比如 16G 内存的PC无法容纳几百 G 的大文件。很多时候我们只是想看看大文件内部的字段长什么样子

content=pd.read_csv(file_path, na_values=["对", "古明地觉"])
# na_values 参数可以配置哪些值需要处理成 NaN,针对整个csv中的全部数据,下面是只对指定的列进行替换
content=pd.read_csv(file_path, sep="\\t", na_values="x": ["古明地觉", "博丽灵梦"], "y": ["对"])

content=pd.read_csv(file_path, na_values=["", "NULL"],keep_default_na=False)
# 除了 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 在读取时就不会擅自将那些默认的值转成空值了
# 但是na_values 参数指定的不受此影响,还是会转换成NAN

content=pd.read_csv(file_path, na_filter=False,skip_blank_lines=False)
# na_filter指定为 False,那么 pandas 在读取 CSV 的时候不会进行任何空值的判断和检测,所有的值都会保留原样。
# 因此,如果你能确保一个 CSV 肯定没有空值,则不妨指定 na_filter 为 False,因为避免了空值检测,可以提高大型文件的读取速度。
# 另外,该参数会屏蔽 keep_default_na 和 na_values,也就是说,当 na_filter 为 False 的时候,这两个参数会失效。

# skip_blank_lines 默认为 True,表示过滤掉空行,如为 False 则解析为 NaN。
# 也可以指定 keep_default_na 为 False 来改变这一点


from datetime import datetime
content=pd.read_csv(file_path, sep="\\t", parse_dates=["date"], date_parser=lambda x: datetime.strptime(x, "%Y年%m月%d日"))
# parse_dates,指定某些列为时间类型,这个参数一般搭配下面的date_parser使用。
# date_parser是用来配合parse_dates参数的,因为有的列虽然是日期,但没办法直接转化,需要我们指定一个解析格式:
# infer_datetime_format 参数默认为 False。如果设定为 True 并且 parse_dates 可用,
# 那么 pandas 将尝试转换为日期类型,如果可以转换,转换方法并解析,在某些情况下会快 5~10 倍。

print(content)

# 分块读入内存,尤其单机处理大文件时会很有用。
# iterator 为 bool类型,默认为False。如果为True,那么返回一个 TextFileReader 对象,以便逐块处理文件。
# 这个在文件很大、内存无法容纳所有数据文件时,可以分批读入,依次处理。
chunk = pd.read_csv(file_path, iterator=True)
print(chunk)  # <pandas.io.parsers.TextFileReader object at 0x000002550189C0A0>

print(chunk.get_chunk(1))#依次从剩余的数据中读取前1行
print(chunk.get_chunk(2))#依次从剩余的数据中读取前2行
# 文件还剩下三行,但是我们指定读取100,那么也不会报错,不够指定的行数,那么有多少返回多少
print(chunk.get_chunk(100))
try:
    # 但是在读取完毕之后,再读的话就会报错了
    chunk.get_chunk(5)
except StopIteration as e:
    print("读取完毕")
# 读取完毕


file_path=r'D:\\pythonProject\\数学建模\\data\\1\\附件1 弱覆盖栅格数据(筛选).csv'#'test.csv'
# chunksize 整型,默认为 None,设置读取文件块的大小。
chunk = pd.read_csv(file_path, chunksize=2)
# 还是返回一个类似于迭代器的对象
print(chunk)  # <pandas.io.parsers.TextFileReader object at 0x0000025501143AF0>
# 调用get_chunk,如果不指定行数,那么就是默认的chunksize
print(chunk.get_chunk())
# 但也可以指定
print(chunk.get_chunk(100))
try:
    chunk.get_chunk(5)
except StopIteration as e:
    print("读取完毕")
# 读取完毕

# content=pd.read_csv(file_path,sep='\\t',delim_whitespace=True)
#sep指定分隔符,delim_whitespace设置为 True 时,表示分割符为空白字符,可以是空格、"\\t"等等。
# 参数 mangle_dupe_cols 默认为 True,重名的列导入后面多一个 .1。如果设置为 False,会抛出不支持的异常:


# compression 参数取值为 'infer', 'gzip', 'bz2', 'zip', 'xz', None,默认 'infer',这个参数直接支持我们使用磁盘上的压缩文件。
# 直接将上面的girl.csv添加到压缩文件,打包成girl.zip
pd.read_csv('girl.zip', sep="\\t", compression="zip")
# housands 千分位分割符,如 , 或者 .,默认为None。
# encoding 指定字符集类型,通常指定为 'utf-8'。根据情况也可能是'ISO-8859-1'

# error_bad_lines和warn_bad_lines 两参数只能在C解析引擎下使用。
# 如果一行包含过多的列,假设csv的数据有5列,但是某一行却有6个数据,数据有问题。那么默认情况下不会返回DataFrame,而是会报错。
# 这时,我们就可以将error_bad_lines设置为False(默认为True),遇到这种情况,直接把这一行扔掉。同时会设置 warn_bad_lines 设置为True,打印剔除的这行。
pd.read_csv('girl.csv', sep="\\t", error_bad_lines=False, warn_bad_lines=True)


print(content)

2.read_excel方法

读取excel文件,包括xlsx、xls、xlsm格式,需要下载openpyxl库

以上是关于Pandas库的学习的主要内容,如果未能解决你的问题,请参考以下文章

Pandas库的学习

Pandas库的学习

Python——最全的Numpy Pandas库的学习笔记

Python——最全的Numpy Pandas库的学习笔记

Python——最全的Numpy Pandas库的学习笔记

python学习——pandas库的使用,仅需要这一篇就足够了