Pandas学习记录

Pandas学习记录


PandasPython语言中非常好用的一种数据结构包,包含了许多有用的数据操作方法。而且很多算法相关的库函数的输入数据结构都要求是pandas数据,或者有该数据的接口。

读写数据

仔细看pandas的API说明文档,就会发现pandas支持很多格式的文件读写:

Format Type Data Description Reader Writer
text CSV read_csv to_csv
text JSON read_json to_json
text HTML read_html to_html
text Local clipboard read_clipboard to_clipboard
binary MS Excel read_excel to_excel
binary HDF5 Format read_hdf to_hdf
binary Feather Format read_feather to_feather
binary Parquet Format read_parquet to_parquet
binary Msgpack read_msgpack to_msgpack
binary Stata read_stata to_stata
binary SAS read_sas
binary Python Pickle Format read_pickle to_pickle
SQL SQL read_sql to_sql
SQL Google Big Query read_gbq to_gbq
  1. read_csv
    对最常用的read_csv函数的参数进行详解
    函数说明:读取CSV(默认逗号分割)文件到DataFrame
  • 基础参数
    filepath_or_buffer: str,pathlib.
    任何可用read()的基类都可以,也可以是URL
    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行开始。)。
    names : array-like, default None
    用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。默认列表中不能出现重复,除非设定参数mangle_dupe_cols=True。
    nrows : int, default None
    需要读取的行数(从文件头开始算起)。
    index_col : int or sequence or False, default None
    用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。
    如果文件不规则,行尾有分隔符,则可以设定index_col=False 来是的pandas不适用第一列作为行索引。
    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
    使用的分析引擎。可以选择C或者是python。C引擎快但是Python引擎功能更加完备。
    converters : dict, default None
    列转换函数的字典。key可以是列名或者列的序号。
    iterator : boolean, default False
    返回一个TextFileReader 对象,以便逐块处理文件。
    compression : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’
    直接使用磁盘上的压缩文件。如果使用infer参数,则使用 gzip, bz2, zip或者解压文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’这些为后缀的文件,否则不解压。如果使用zip,那么ZIP包中必须只包含一个文件。设置为None则不解压。
    decimal : str, default ‘.’`
    字符中的小数点 (例如:欧洲数据使用’,‘).

  • 忽略及空缺值
    skipinitialspace : boolean, default False
    忽略分隔符后的空白(默认为False,即不忽略).
    skiprows : list-like or integer, default None
    需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)。
    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可以提升读取速度。kip_blank_lines : boolean, default True `
    如果为True,则跳过空行;否则记为NaN。

  • 其他(引号、编码)
    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时,指定一个字符使的不受分隔符限值。
    encoding : str, default None
    指定字符集类型,通常指定为’utf-8’. List of Python standard encodings
    下使用)。

数据结构

Dimensions Name Description
1 Series 1D labeled
2 DataFrame General 2D labeled

DataFrame

创建

  • 通过字典创建
In [10]: df2 = pd.DataFrame({ 'A' : 1.,
   ....:                      'B' : pd.Timestamp('20130102'),
   ....:                      'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
   ....:                      'D' : np.array([3] * 4,dtype='int32'),
   ....:                      'E' : pd.Categorical(["test","train","test","train"]),
   ....:                      'F' : 'foo' })
   ....: 

In [11]: df2
Out[11]: 
     A          B    C  D      E    F
0  1.0 2013-01-02  1.0  3   test  foo
1  1.0 2013-01-02  1.0  3  train  foo
2  1.0 2013-01-02  1.0  3   test  foo
3  1.0 2013-01-02  1.0  3  train  foo
  • 通过numpy,并指定列明,索引名创建
In [6]: dates = pd.date_range('20130101', periods=6)

In [7]: dates
Out[7]: 
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06'],
              dtype='datetime64[ns]', freq='D')

In [8]: df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))

In [9]: df
Out[9]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401
2013-01-06 -0.673690  0.113648 -1.478427  0.524988

查看数据及其相关属性

df.head(num): 前num行
df.tail(num): 倒数num行
df.index: 索引名
df.columns: 列名
df.values: 数据值

内置操作

  • 转置:df.T
  • 排序:
    • 按索引排序 df.sort_index(axis=1, ascending=False)
    • 按列数据排序 df.sort_values(by='B')

选择筛选

  • 通过行索引/列名:df['A']df[0:3]df['20130102':'20130104']
  • 通过label选择:df.loc
    • df.loc[:,['A','B']]
    • df.loc['20130102':'20130104',['A','B']]
    • df.loc[dates[0],'A'] = df.at[dates[0],'A']
  • 通过定位选择:df.iloc
    • df.iloc[3]
    • df.iloc[3:5,0:2]
    • df.iloc[[1,2,4],[0,2]]
    • df.iloc[1,1] = df.iat[1,1]
  • 通过布尔值选择
    • df[df.A > 0] A列中大于0的所有行
    • df[df > 0] df中所有<=0的置为空缺值
    • df2[df2['E'].isin(['two','four'])]
    In [43]: df2
    Out[43]: 
                       A         B         C         D      E
    2013-01-01  0.469112 -0.282863 -1.509059 -1.135632    one
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236    one
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804    two
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860  three
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401   four
    2013-01-06 -0.673690  0.113648 -1.478427  0.524988  three
    
    In [44]: df2[df2['E'].isin(['two','four'])]
    Out[44]: 
                       A         B         C         D     E
    2013-01-03 -0.861849 -2.104569 -0.494929  1.071804   two
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401  four
    

修改值

  • df['F'] = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
  • df.at[dates[0],'A'] = 0
  • df.loc[:,'D'] = np.array([5] * len(df))
  • data = data.loc[:,cols] 交换列顺序

DataFrame合并

  • Concat
  • Join
  • Append

apply函数

DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
func:函数指针,可以是lamda函数,自己实现
axis:指定函数的传入参数,若axis = 1,就会把每一行数据作为Series进行传入
args:func函数的参数

import pandas as pd
import datetime   #用来计算日期差的包

def dataInterval(data1,data2):
    d1 = datetime.datetime.strptime(data1, '%Y-%m-%d')
    d2 = datetime.datetime.strptime(data2, '%Y-%m-%d')
    delta = d1 - d2
    return delta.days

def getInterval_new(arrLike,before,after):  #用来计算日期间隔天数的调用的函数
    before = arrLike[before]
    after = arrLike[after]
    days = dataInterval(after.strip(),before.strip())  #注意去掉两端空白
    return days

if __name__ == '__main__':    
    fileName = "NS_new.xls";
    df = pd.read_excel(fileName) 
    df['TimeInterval'] = df.apply(getInterval_new , 
      axis = 1, args = ('ReceivedTime','PublishedTime'))    #调用方式一
    #下面的调用方式等价于上面的调用方式
    df['TimeInterval'] = df.apply(getInterval_new , 
      axis = 1, **{'before':'ReceivedTime','after':'PublishedTime'})  #调用方式二
    #下面的调用方式等价于上面的调用方式
    df['TimeInterval'] = df.apply(getInterval_new , 
      axis = 1, before='ReceivedTime',after='PublishedTime')  #调用方式三

参考

  1. pandas官网API文档
  2. Pandas的Apply函数——Pandas中最好用的函数
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章