# 数据输入

# 文件读取

常用函数如下:

函数 说明
read_csv 读取默认以逗号作为分隔符的文件
read_table 读取默认以制表符分隔的文件
read_fwf 从特定宽度格式的文件中读取数据(无分隔符)
read_clipboard read_table的剪贴板版本
read_excel 从EXCEL的XLS或者XLSX文件中读取数据
read_hdf 读取用pandas存储的HDF5文件
read_html 从HTML文件中读取所有表格数据
read_json 从JSON字符串中读取数据
read_msgpack 读取MessagePack格式存储的任意对象
read_pickle 读取以Python Pickle格式存储的对象
read_sas 读取SAS系统中定制存储格式的数据集
read_sql 将SQL查询的结果读取出来
read_stata 读取stata格式的数据集
read_feather 读取Feather二进制格式
  • 在Pandas的使用场景中,最多的是将表格型的数据读取为DataFrame对象。实现这一功能的函数有很多,最常用的是read_csvread_table

    • 通常第一行默认会被当成列索引,需要设置head=None

    • 设置sep=""(支持正则)指定分隔符(这种情况下read_csv 和read_table没有什么区别)

    • 设置usecols指定读取哪些列

    • 设置skiprows指定跳过哪些行

    • 设置na_values指定将哪些值当成缺失值看待

      In [30]: result = pd.read_csv('d:/ex5.csv')
      In [31]: result
      Out[31]:
        something  a   b     c   d message
      0       one  1   2   3.0   4     NaN
      1       two  5   6   NaN   8   world
      2     three  9  10  11.0  12     foo
      
      In [40]: result = pd.read_csv('d:/ex5.csv',na_values=[3.0])
      
      In [41]: result
      Out[41]:
        something  a   b     c   d message
      0       one  1   2   NaN   4     NaN
      1       two  5   6   NaN   8   world
      2     three  9  10  11.0  12     foo
      
      • 可以为不同列指定不同的缺失值标识-传入列名为键的字典即可

        In [42]: f = {'message':['foo','NA'],'something':['two']}
        
        In [43]: result = pd.read_csv('d:/ex5.csv',na_values=f)
        
        In [44]: result
        Out[44]:
          something  a   b     c   d message
        0       one  1   2   3.0   4     NaN
        1       NaN  5   6   NaN   8   world
        2     three  9  10  11.0  12     NaN
        
    • 常用参数如下:

      参数 说明
      path 文件路径
      sep 指定分隔符或正则表达式
      header 用作列名的行号
      index_col 用作行索引的列名或列号
      names 结果的列名列表
      skiprows 从起始处,需要跳过的行
      na_values 需要用NaN替换的值
      comment 在行结尾处分隔注释的字符
      parse_dates 尝试将数据解析为datetime,默认是False
      keep_date_col 如果连接列到解析日期上,保留被连接的列,默认False
      converters 包含列名称映射到函数的字典
      dayfirst 解析非明确日期时,按国际格式处理
      date_parser 用于解析日期的函数
      nrows 从文件开头处读入的行数
      iterator 返回一个TextParser对象,用于零散地读入文件
      chunksize 用于迭代的块大小
      skip_footer 忽略文件尾部的行数
      verbose 打印各种解析器输出的信息
      encoding 文本编码,比如UTF-8
      thousands 定义千位分隔符,例如逗号或者圆点
  • 使用read_json​函数可以自动将JSON数据集按照指定的顺序转换为Series或者DataFrame对象,其默认做法是假设JSON数据中的每个对象是表里的一行

    
    
    
    [{"a": 1, "b": 2, "c": 3},
     {"a": 4, "b": 5, "c": 6},
     {"a": 7, "b": 8, "c": 9}]
    
    In [81]: data = pd.read_json('d:/example.json')
    
    In [82]: data
    Out[82]:
       a  b  c
    0  1  2  3
    1  4  5  6
    2  7  8  9
    
    • 使用to_json函数可以将pandas对象转换为json格式

      In [83]: print(data.to_json())
      {"a":{"0":1,"1":4,"2":7},"b":{"0":2,"1":5,"2":8},"c":{"0":3,"1":6,"2":9}}
      
  • 使用read_excel和write_excel从Excle 2003或更高版本文件中读写数据

    • In [106]: df = pd.read_excel('d:/ex1.xlsx', 'Sheet1') # 读取指定的表
      
      In [107]: df
      Out[107]:
         a   b   c   d message
      0  1   2   3   4   hello
      1  5   6   7   8   world
      2  9  10  11  12     foo
      
    • df.to_excel('d:/ex3.xlsx')
      
  • 文件分块读取

    • 设置nrows指定从文件开始只读取前n行

    • 设置chunksize作为每一块的行数,分块读入文件

      • 返回的结果是一个可迭代对象
      • In [50]: chunker = pd.read_csv('d:/ex6.csv', chunksize=1000)
        
        In [51]: chunker
        Out[51]: <pandas.io.parsers.TextFileReader at 0x2417d6cfb38>
        
      • # 遍历并对‘key’列进行聚合获得计数值:
        In [52]: total = pd.Series([])
        
        In [53]: for piece in chunker:
            ...:     total = total.add(piece['key'].value_counts(), fill_value=0)
            ...: total = total.sort_values(ascending=False)
        
        In [54]: total
        Out[54]:
        E    368.0
        X    364.0
        L    346.0
        O    343.0
        Q    340.0
             ...
        5    157.0
        2    152.0
        0    151.0
        9    150.0
        1    146.0
        Length: 36, dtype: float64
        
        In [55]: total[:10]
        Out[55]:
        E    368.0
        X    364.0
        L    346.0
        O    343.0
        Q    340.0
        M    338.0
        J    337.0
        F    335.0
        K    334.0
        H    330.0
        dtype: float64