IT虾米网

Python3 pandas用法大全详解

leader 2019年07月17日 编程语言 2080 0

Python3 pandas用法大全

一、生成数据表 

1、首先导入pandas库,一般都会用到numpy库,所以我们先导入备用:

import numpy as np 
import pandas as pd

2、导入CSV或者xlsx文件:

df = pd.DataFrame(pd.read_csv('name.csv',header=1)) 
df = pd.DataFrame(pd.read_excel('name.xlsx')) 
#pandas还可以读取一下文件:  
read_csv,  
read_excel,  
read_hdf,  
read_sql,  
read_json,  
read_msgpack (experimental),  
read_html,  
read_gbq (experimental),  
read_stata,  
read_sas,  
read_clipboard,  
read_pickle;  
#相应的写入:  
to_csv,  
to_excel,  
to_hdf,  
to_sql,  
to_json,  
to_msgpack (experimental),  
to_html,  
to_gbq (experimental),  
to_stata,  
to_clipboard,  
to_pickle.

(1)pandas.read_csv()参数整理:

  读取CSV(逗号分割)文件到DataFrame,也支持文件的部分导入和选择迭代。
  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 参数失效。在新版本0.18.1支持
   header : int or list of ints, default ‘infer’
  指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。如果明确设定header=0 就会替换掉原来存在列名。header参数可以是一个list例如:[0,1,3],
  这个list表示将文件中的这些行作为列标题(意味着每一列有多个标题),介于中间的行将被忽略掉
  注意:如果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。
    parse_dates : boolean or list of ints or names or list of lists or dict, default False
    • boolean. True -> 解析索引
    • list of ints or names. e.g. If [1, 2, 3] -> 解析1,2,3列的值作为独立的日期列;
    • list of lists. e.g. If [[1, 3]] -> 合并1,3列作为一个日期列使用
    • dict, e.g. {‘foo’ : [1, 3]} -> 将1,3列合并,并给合并后的列起名为"foo"
    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则不解压。
  新版本0.18.1版本支持zip和xz解压
    thousands : str, default None
  千分位分割符,如“,”或者“."
    decimal : str, default ‘.’
  字符中的小数点 (例如:欧洲数据使用’,‘).
    float_precision : string, default None
  Specifies which converter the C engine should use for floating-point values. The options are None for the ordinary converter, high for the high-precision converter, and round_trip for the round-trip converter.
  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
  标识着多余的行不被解析。如果该字符出现在行首,这一行将被全部忽略。这个参数只能是一个字符,空行(就像skip_blank_lines=True)注释行被header和skiprows忽略一样。
  例如如果指定comment='#' 解析‘#empty\na,b,c\n1,2,3’ 以header=0 那么返回结果将是以’a,b,c'作为header。
    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
  Leave a list of tuples on columns as is (default is to convert to a Multi Index on the columns)
    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解析器中有效)
    buffer_lines : int, default None
  不推荐使用,这个参数将会在未来版本移除,因为他的值在解析器中不推荐使用
    compact_ints : boolean, default False
  不推荐使用,这个参数将会在未来版本移除
  如果设置compact_ints=True ,那么任何有整数类型构成的列将被按照最小的整数类型存储,是否有符号将取决于use_unsigned 参数
    use_unsigned : boolean, default False
  不推荐使用:这个参数将会在未来版本移除
  如果整数列被压缩(i.e. compact_ints=True),指定被压缩的列是有符号还是无符号的。
  memory_map : boolean, default False
  如果使用的文件在内存内,那么直接map文件使用。使用这种方式可以避免文件再次进行IO操作。

(2)pandas.read_csv()实例:

#read_csv会自动加上行索引,即使原数据集有行索引 
obj=pd.read_csv('f:/ceshi.csv') 
#获取对应的列值,从列名获取值,header必须从0开始或者默认 
obj['列名'] 
 
#header=None时,即指明原始文件数据没有列索引,这样read_csv为自动加上列索引,除非你给定列索引的名字。 
obj_2=pd.read_csv('f:/ceshi.csv',header=None,names=range(2,5)) 
 
#header=0,表示文件第0行(即第一行,python,索引从0开始)为列索引,这样加names会替换原来的列索引。 
obj_2=pd.read_csv('f:/ceshi.csv',index_col=0) 
 
#index_col为指定数据中哪一列作为Dataframe的行索引,也可以可指定多列,形成层次索引,默认为None,即不指定行索引,这样系统会自动加上行索引(0-) 
obj_2=pd.read_csv('f:/ceshi.csv',index_col=[0,2]) 
 
#usecols:可以指定原数据集中,所使用的列。在本例中,共有4列,当usecols=[0,1,2,3]时,即选中所有列,之后令第一列为行索引,当usecols=[1,2,3]时,即从第二列开始,之后令原始数据集的第二列为行索引。 
obj_2=pd.read_csv('f:/ceshi.csv',index_col=0,usecols=[0,1,2,3]) 
 
#nrows:可以给出从原始数据集中的所读取的行数,目前只能从第一行开始到nrows行 
obj_2=pd.read_csv('f:/ceshi.csv',index_col=0,nrows=3)

3、用pandas创建数据表:

df = pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006],  
  "date":pd.date_range('20130102', periods=6), 
  "city":['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '], 
  "age":[23,44,54,32,34,32], 
  "category":['100-A','100-B','110-A','110-C','210-A','130-F'], 
  "price":[1200,np.nan,2133,5433,np.nan,4432]}, 
  columns =['id','date','city','category','age','price'])

二、数据表信息查看 

1、维度查看:

df.shape

2、数据表基本信息(维度、列名称、数据格式、所占空间等):

df.info()

3、每一列数据的格式:

df.dtypes

4、某一列格式:

df['B'].dtype

5、空值:

df.isnull()

6、查看某一列空值:

df['B'].isnull()

7、查看某一列的唯一值:

df['B'].unique()

8、查看数据表的值: 

df.values 

9、查看列名称:

df.columns

10、查看前10行数据、后10行数据:

df.head() #默认前10行数据 
df.tail()    #默认后10 行数据

三、数据表清洗 

 1、用数字0填充空值:

df.fillna(value=0)

2、使用列prince的均值对NA进行填充:

df['prince'].fillna(df['prince'].mean())

3、清楚city字段的字符空格:

df['city']=df['city'].map(str.strip)

4、大小写转换:

df['city']=df['city'].str.lower()

5、更改数据格式:

df['price'].astype('int')       

6、更改列名称:

df.rename(columns={'category': 'category-size'}) 

7、删除后出现的重复值:

df['city'].drop_duplicates()

8、删除先出现的重复值:

df['city'].drop_duplicates(keep='last')

9、数据替换:

df['city'].replace('sh', 'shanghai')

四、数据预处理

df1=pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006,1007,1008],  
"gender":['male','female','male','female','male','female','male','female'], 
"pay":['Y','N','Y','Y','N','Y','N','Y',], 
"m-point":[10,12,20,40,40,40,30,20]})

1、数据表合并

df_inner=pd.merge(df,df1,how='inner')  # 匹配合并,交集 
df_left=pd.merge(df,df1,how='left')        # 
df_right=pd.merge(df,df1,how='right') 
df_outer=pd.merge(df,df1,how='outer')  #并集

2、设置索引列

df_inner.set_index('id')

3、按照特定列的值排序:

df_inner.sort_values(by=['age'])

4、按照索引列排序:

df_inner.sort_index()

5、如果prince列的值>3000,group列显示high,否则显示low:

df_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')

 6、对复合多个条件的数据进行分组标记

df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1

7、对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size

pd.DataFrame((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size']))

8、将完成分裂后的数据表和原df_inner数据表进行匹配

df_inner=pd.merge(df_inner,split,right_index=True, left_index=True)

五、数据提取 

主要用到的三个函数:loc,iloc和ix,loc函数按标签值进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取。 
1、按索引提取单行的数值

df_inner.loc[3]

2、按索引提取区域行数值

df_inner.iloc[0:5]

3、重设索引

df_inner.reset_index()

4、设置日期为索引

df_inner=df_inner.set_index('date')

5、提取4日之前的所有数据

df_inner[:'2013-01-04']

6、使用iloc按位置区域提取数据

df_inner.iloc[:3,:2] #冒号前后的数字不再是索引的标签名称,而是数据所在的位置,从0开始,前三行,前两列。

7、适应iloc按位置单独提起数据

df_inner.iloc[[0,2,5],[4,5]] #提取第0、2、5行,4、5列

8、使用ix按索引标签和位置混合提取数据

df_inner.ix[:'2013-01-03',:4] #2013-01-03号之前,前四列数据

9、判断city列的值是否为北京

df_inner['city'].isin(['beijing'])

10、判断city列里是否包含beijing和shanghai,然后将符合条件的数据提取出来

df_inner.loc[df_inner['city'].isin(['beijing','shanghai'])] 

11、提取前三个字符,并生成数据表

pd.DataFrame(category.str[:3])

六、数据筛选 

使用与、或、非三个条件配合大于、小于、等于对数据进行筛选,并进行计数和求和。 
1、使用“与”进行筛选

df_inner.loc[(df_inner['age'] > 25) & (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']]

2、使用“或”进行筛选

df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']].sort(['age']) 

3、使用“非”条件进行筛选

df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']) 

4、对筛选后的数据按city列进行计数

df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']).city.count()

5、使用query函数进行筛选

df_inner.query('city == ["beijing", "shanghai"]')

6、对筛选后的结果按prince进行求和

df_inner.query('city == ["beijing", "shanghai"]').price.sum()

七、数据汇总 主要函数是groupby和pivote_table 
1、对所有的列进行计数汇总

df_inner.groupby('city').count()

2、按城市对id字段进行计数

df_inner.groupby('city')['id'].count()

3、对两个字段进行汇总计数

df_inner.groupby(['city','size'])['id'].count()

4、对city字段进行汇总,并分别计算prince的合计和均值

df_inner.groupby('city')['price'].agg([len,np.sum, np.mean]) 

八、数据统计

数据采样,计算标准差,协方差和相关系数 
1、简单的数据采样

df_inner.sample(n=3) 

2、手动设置采样权重

weights = [0, 0, 0, 0, 0.5, 0.5] 
df_inner.sample(n=2, weights=weights) 

3、采样后不放回

df_inner.sample(n=6, replace=False) 

4、采样后放回

df_inner.sample(n=6, replace=True)

5、 数据表描述性统计

df_inner.describe().round(2).T #round函数设置显示小数位,T表示转置

6、计算列的标准差

df_inner['price'].std()

7、计算两个字段间的协方差

df_inner['price'].cov(df_inner['m-point'])

8、数据表中所有字段间的协方差

df_inner.cov()

9、两个字段的相关性分析

df_inner['price'].corr(df_inner['m-point']) #相关系数在-1到1之间,接近1为正相关,接近-1为负相关,0为不相关

10、数据表的相关性分析

df_inner.corr()

九、数据输出 

分析后的数据可以输出为xlsx格式和csv格式 
1、写入Excel

df_inner.to_excel('excel_to_python.xlsx', sheet_name='bluewhale_cc') 

2、写入到CSV

df_inner.to_csv('excel_to_python.csv') 

 

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

python3 库pandas写入csv格式文件出现中文乱码问题解决方法详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。