最近不管是在学习可视化还是NLP的时候,对于一些csv文件的处理显得很生疏。于是根据课上学到的内容,以及查询了一些博客文章,整理出了以下一些Pandas中十分常用的方法。
一、数据导入
Pandas可以导入以下数据类型,本篇博客此处就Excel和csv文件详细解读
pd.read_csv(filename) | 从CSV文件导入数据 |
pd.read_table(filename) | 从限定分隔符的文本文件导入数据 |
pd.read_excel(filename) | 从Excel文件导入数据 |
pd.read_sql(query, connection_object) | 从SQL表/库导入数据 |
pd.read_json(json_string) | 从JSON格式的字符串导入数据 |
pd.read_html(url) | 解析URL、字符串或者HTML文件 |
pd.read_clipboard() | 从粘贴板获取内容 |
pd.DataFrame(dict) | 从字典对象导入数据 |
读取Excel文件
read_excel(io, sheet_name=0, header=0, names=None, index_col=None,
usecols=None, squeeze=False, dtype=None, engine=None,
converters=None, true_values=None, false_values=None, skiprows=None,
nrows=None, na_values=None, parse_dates=False, date_parser=None, thousands=None,
comment=None, skipfooter=0, convert_float=True, **kwds)
乍一看参数是非常多的,但是主要的参数如下:
-
io
输入的Excel文件。可以是字符串、文件对象、ExcelFile对象,可以是本地文件,也可以是URL。 -
sheet_name:
是Excel文件工作表名,可以是字符串、整数(基于0的工作表位置索引)、列表(选择多个列表) -
header:
用作DataFrame对象列标签的行号,默认是0(第一行);如果设置为None,则没有指定列标签 -
index_col:
用作DataFrame对象的行标签的列号,默认为None -
skiprows:
忽略文件头部行数,默认是None -
skipfooter:
忽略文件尾部行数,默认为0
读取csv文件
read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',
names=None, index_col=None, usecols=None,
squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None,
engine=None, converters=None,true_values=None, false_values=None,
skipinitialspace=False, skiprows=None, nrows=None, na_values=None,
keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True,
parse_dates=False,infer_datetime_format=False, keep_date_col=False,
date_parser=None, dayfirst=False, iterator=False,chunksize=None,
compression='infer', thousands=None, decimal=b'.', lineterminator=None,
quotechar='"',quoting=0, escapechar=None, comment=None, encoding=None,
dialect=None, tupleize_cols=None, error_bad_lines=True,warn_bad_lines=True,
skipfooter=0, doublequote=True, delim_whitespace=False, low_memory=True,
memory_map=False,float_precision=None)
-
filepath_or_buffer : str,pathlib。str, pathlib.Path, py._path.local.LocalPath or any object with a read() method (such as a file handle or StringIO)
可以是URL,可用URL类型包括:http, ftp, s3和文件 -
sep : str, default ‘,’
指定分隔符。如果不指定参数,则会尝试使用逗号分隔。分隔符长于一个字符并且不是‘\s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:’\r\t’ -
delimiter : str, default None
定界符,备选分隔符(如果指定该参数,则sep参数失效) -
delim_whitespace : boolean, default False.
指定空格(例如’ ‘或者’ ‘)是否作为分隔符使用,等效于设定sep=’\s+’。如果这个参数设定为Ture那么delimiter 参数失效。 -
header : int or list of ints, default ‘infer’
指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。如果明确设定header=0 就会替换掉原来存在列名。header参数可以是一个list例如:[0,1,3],这个list表示将文件中的这些行作为列标题(意味着每一列有多个标题),介于中间的行将被忽略掉(例如本例中的2;本例中的数据1,2,4行将被作为多级标题出现,第3行数据将被丢弃,dataframe的数据从第5行开始。)。
注意:如果skip_blank_lines=True 那么header参数忽略注释行和空行,所以header=0表示第一行数据而不是文件的第一行。 -
names : array-like, default None
用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。默认列表中不能出现重复,除非设定参数mangle_dupe_cols=True。 -
index_col : int or sequence or False, default None
用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。
如果文件不规则,行尾有分隔符,则可以设定index_col=False 保证pandas用第一列作为行索引。 -
usecols : array-like, default None
返回一个数据子集,该列表中的值必须可以对应到文件中的位置(数字可以对应到指定的列)或者是字符传为文件中的列名。例如:usecols有效参数可能是 [0,1,2]或者是 [‘foo’, ‘bar’, ‘baz’]。使用这个参数可以加快加载速度并降低内存消耗。 -
as_recarray : boolean, default False
不赞成使用:该参数会在未来版本移除。请使用pd.read_csv(…).to_records()替代。
返回一个Numpy的recarray来替代DataFrame。如果该参数设定为True。将会优先squeeze参数使用。并且行索引将不再可用,索引列也将被忽略。 -
squeeze : boolean, default False
如果文件值包含一列,则返回一个Series -
prefix : str, default None
在没有列标题时,给列添加前缀。例如:添加‘X’ 成为 X0, X1, … -
mangle_dupe_cols : boolean, default True
重复的列,将‘X’…’X’表示为‘X.0’…’X.N’。如果设定为false则会将所有重名列覆盖。 -
dtype : Type name or dict of column -> type, default None
每列数据的数据类型。例如 {‘a’: np.float64, ‘b’: np.int32} -
engine : {‘c’, ‘python’}, optional
Parser engine to use. The C engine is faster while the python engine is currently more feature-complete.
使用的分析引擎。可以选择C或者是python。C引擎快但是Python引擎功能更加完备。 -
converters : dict, default None
列转换函数的字典。key可以是列名或者列的序号。 -
true_values : list, default None
Values to consider as True -
false_values : list, default None
Values to consider as False -
skipinitialspace : boolean, default False
忽略分隔符后的空白(默认为False,即不忽略). -
skiprows : list-like or integer, default None
需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)。 -
skipfooter : int, default 0
从文件尾部开始忽略。 (c引擎不支持) -
skip_footer : int, default 0
不推荐使用:建议使用skipfooter ,功能一样。 -
nrows : int, default None
需要读取的行数(从文件头开始算起)。 -
na_values : scalar, str, list-like, or dict, default None
一组用于替换NA/NaN的值。如果传参,需要制定特定列的空值。默认为‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’`. -
keep_default_na : bool, default True
如果指定na_values参数,并且keep_default_na=False,那么默认的NaN将被覆盖,否则添加。 -
na_filter : boolean, default True
是否检查丢失值(空字符串或者是空值)。对于大文件来说数据集中没有空值,设定na_filter=False可以提升读取速度。 -
verbose : boolean, default False
是否打印各种解析器的输出信息,例如:“非数值列中缺失值的数量”等。 -
skip_blank_lines : boolean, default True
如果为True,则跳过空行;否则记为NaN。 -
infer_datetime_format : boolean, default False
如果设定为True并且parse_dates 可用,那么pandas将尝试转换为日期类型,如果可以转换,转换方法并解析。在某些情况下会快5~10倍。 -
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格式的日期类型 -
iterator : boolean, default False
返回一个TextFileReader 对象,以便逐块处理文件。 -
chunksize : int, default None
文件块的大小, See IO Tools docs for more informationon iterator and chunksize. -
compression : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’
直接使用磁盘上的压缩文件。如果使用infer参数,则使用 gzip, bz2, zip或者解压文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’这些为后缀的文件,否则不解压。如果使用zip,那么ZIP包中国必须只包含一个文件。设置为None则不解压。 -
thousands : str, default None
千分位分割符,如,
或者.
-
decimal : str, default ‘.’
字符中的小数点 -
float_precision : string, default None
指定C引擎应用于浮点值的转换器。普通转换器没有选项,高精度转换器有选项,往返转换器有选项。 -
lineterminator : str (length 1), default None
行分割符,只在C解析器下使用。 -
quotechar : str (length 1), optional
引号,用作标识开始和解释的字符,引号内的分割符将被忽略。 -
quoting : int or csv.QUOTE_* instance, default 0
控制csv中的引号常量。可选 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3) -
doublequote : boolean, default True
双引号,当单引号已经被定义,并且quoting 参数不是QUOTE_NONE的时候,使用双引号表示引号内的元素作为一个元素使用。 -
escapechar : str (length 1), default None
当quoting 为QUOTE_NONE时,指定一个字符使的不受分隔符限值。 -
comment : str, default None
标识着多余的行不被解析。如果该字符出现在行首,这一行将被全部忽略。 -
encoding : str, default None
指定字符集类型,通常指定为’utf-8’. List of Python standard encodings -
dialect : str or csv.Dialect instance, default None
如果没有指定特定的语言,如果sep大于一个字符则忽略。具体查看csv.Dialect 文档 -
tupleize_cols : boolean, default False
保留列上元组的列表不变(默认值是转换为列上的多索引) -
error_bad_lines : boolean, default True
如果一行包含太多的列,那么默认不会返回DataFrame ,如果设置成false,那么会将改行剔除(只能在C解析器下使用)。 -
warn_bad_lines : boolean, default True
如果error_bad_lines =False,并且warn_bad_lines =True 那么所有的“bad lines”将会被输出(只能在C解析器下使用)。 -
low_memory : boolean, default True
分块加载到内存,再低内存消耗中解析。但是可能出现类型混淆。确保类型不被混淆需要设置为False。或者使用dtype 参数指定类型。注意使用chunksize 或者iterator 参数分块读入会将整个文件读入到一个Dataframe,而忽略类型(只能在C解析器中有效)
二、数据信息查看
本篇博客导入的是titanic数据集
titanic = pd.read_csv('titanic.csv')
df.head(n)
查看DataFrame对象的前n行,默认n为5
titanic.head()
df.tail(n)
查看DataFrame对象的最后n行,默认n为5
titanic.tail()
df.shape
查看行数和列数,注意此处没有()
titanic.shape
df.info()
查看索引、数据类型和内存信息
titanic.info()
可以通过这个方法查看数据集的一些基本信息。综合titanic.shape的输出结果(总共891条)可以看到,在age、embarked、deck、embark_town这四个维度上是有缺失值的
df.describe()
查看数值型列的汇总统计
titanic.describe()
可以看出,df.describe()从均值、标准差、上四分位数、中位数等方面进行了汇总统计
s.value_counts()
查看Series对象的唯一值和计数
titanic['class'].value_counts()
由于是Series对象,所以要先索引某一列。
还可以通过dict()或list()转换成需要的格式
dict(titanic['class'].value_counts())
list(titanic['class'].value_counts())
df.values
以array的形式返回数据表的值
titanic.values
df.values.tolist()
分别将每条数据以列表的形式返回
titanic.values.tolist()
df.columns.values.tolist()
以列表的形式返回列名
(同样,df.columns.values是以array的形式返回列名,在此不再列举)
titanic.columns.values.tolist()
df.dtypes
查看所有列的数据类型
titanic.dtypes
s.dtype
查看某一列的数据类型
titanic['age'].dtype
三、数据清洗
df.isnull()
检查DataFrame对象中的控制,并返回一个boolean数组
titanic.isnull()
df.isnull().any()
列级别的判断,只要某一列有空值或NaN,就为True,否则为False
titanic.isnull().any()
df[df.isnull().values==True]
只显示存在缺失值的行列,可以更清楚的确定缺失值的位置
titanic[titanic.isnull().values==True]
df.notnull()
检查DataFrame对象中的非空值,并返回一个Boolean数组
titanic.notnull()
df.dropna()
删除所有包含空值的行
titanic_dna = titanic.dropna()
titanic_dna.head()
df.fillna(x)
用x替换DataFrame对象中所有的空值
titanic_fna = titanic.fillna(5)
titanic_fna.head()
s.astype()
更改某一列的数据格式
titanic_dna['age'].astype(int)
s.drop_duplicates()
删除后出现的重复值
可以通过加入参数keep='last'
使其删除先出现的重复值
s.replace(a,b)
用b替换所有等于a的值
titanic['pclass'].replace(1,'One').replace(2,'Two').replace(3,'Three')
四、数据预处理
df.set_index()
设置索引列
titanic.set_index('age')
df_inner.sort_values(by=[’’])
按照特定列的值排序
titanic.sort_values(by=['age'])
可以添加参数ascending=False
使其倒序排序
还可以指定多行排序
titanic.sort_values(by=['age','fare'],ascending = [False,True])
先按age倒序排序,当age值相同时,根据fare的值顺序排序
df_inner.sort_index()
按照索引列排序.
axis=0
按照行名排序;axis=1
按照列名排序。默认axis=0
titanic.sort_index(axis=1)
同样也可以通过指定ascending=False
来倒序排序
np.where()
这个不好表示,就直接上例子吧
import numpy as np
titanic['survived'] = np.where(titanic['age'] < 10,'high_prob','low_prob')
titanic
具体来说,就是按照age的大小,如果age小于10,那么survived的值为high_prob,否则为low_prob。由于此处NaN没有处理,因此age为NaN的行survived的值均为low_prob
df[df[col]>n]
选择col列的值大于n的行
titanic[titanic['age']>70]
df.groupby(col)
返回一个按col进行分组的Groupby对象
titanic.groupby('sex')
若想看分组后的内容,还需要加个groups
titanic.groupby('sex').groups
五、数据统计
s.std()
计算某一列的标准差
titanic['fare'].std()
s1.cov(s2)
计算两个字段间的协方差
titanic['survived'].cov(titanic['age'])titanic['survived'].cov(titanic['age'])
df.cov()
计算所有字段间的协方差
titanic.cov()
s1.corr(s2)
两个字段的相关性分析,计算出来的是pearson系数
titanic['survived'].corr(titanic['age'])
df.corr()
整个数据表的相关性分析
titanic.corr()
先处理掉缺失值后,再进行corr()可能结果会更有说服力
–
df.count()
返回每一列中的非空值的个数
titanic.count()
df.sample()
对数据进行采样
可以添加参数n=N
取出N个样本
titanic.sample(4)
还可以添加weights手动设置采样权重
weights = np.random.random(891)
titanic.sample(n=4, weights=weights)
此处需要注意weights的值的个数和titanic的要是一样的,否则会报错
通过修改replace的参数确定是否放回。replace=True
代表采样后放回,replace=False
代表采样后不放回
titanic.sample(n=4,replace=True)
六、数据汇总
数据汇总,是基于groupby()和count()的
df.groupby(‘col1’).count()
按照col1列对整个数据表汇总
titanic.groupby('sex').count()
还可以指定两个列进行汇总
titanic.groupby(['sex','pclass']).count()
df.groupby(‘col1’)[‘col2’].count()
按照col1列对整个数据表汇总后,单独取出col2列的汇总结果
titanic.groupby('sex')['age'].count()
df.groupby(‘col1’)[‘col2’].agg()
对分类汇总后的结果进行处理,如:
titanic.groupby('sex')['fare'].agg([len,np.sum,np.mean])
计算了按sex分组后,fare的总和以及均值
七、数据导出
df.to_csv(filename) | 导出数据到CSV文件 |
df.to_excel(filename) | 导出数据到Excel文件 |
df.to_sql(table_name, connection_object) | 导出数据到SQL表 |
df.to_json(filename) | 以Json格式导出数据到文本文件 |
参考
[1] https://blog.csdn.net/liufang0001/article/details/77856255/
[2] https://blog.csdn.net/shanzhonglujie/article/details/81354653
[3] https://blog.csdn.net/LHISLH/article/details/48436327
[4] https://blog.csdn.net/u010801439/article/details/80033341
[5] https://blog.csdn.net/xiaoxiaosuwy/article/details/81187694