Pandas IO工具

断了今生、忘了曾经 提交于 2020-04-05 19:20:41

文件读取与存储

pandas提供了将表格型数据读取为DataFrame对象的函数。其中read_csv和read_table可能会是你今后用的最多的。

csv操作 pandas.read_csv和pandas.read_table

读取csv

pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer',
names=None, index_col=None, usecols=None,...)

read_table(...)
  • filepath_or_buffer:文件路径
  • sep 指定分隔符。如果不指定参数,则会尝试使用逗号分隔。
  • header 指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。
  • usecols:指定读取的列名,列表形式,用作筛选所需要的数据,也可以通过drop函数剔除数据
  • names:如果遇到直接就是数据的文件,需要通过names参数手动填入索引项
  • skipinitialspace 忽略分隔符后的空白
  • skiprows 需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)
  • nrows 需要读取的行数(从文件头开始算起)。

实例:

读取有标题的文件

#ex1.csv   文件内容
a,b,c,d,message
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
import pandas as pd
import numpy as np
df = pd.read_csv('./ex1.csv')
print(df)
print('''-----df.keys()---------''')  
print(df.keys())

输出:
   a   b   c   d message
0  1   2   3   4   hello
1  5   6   7   8   world
2  9  10  11  12     foo
-----df.keys()---------
Index(['a', 'b', 'c', 'd', 'message'], dtype='object')

还可以使⽤read_table,并指定分隔符

import pandas as pd
import numpy as np
df = pd.read_table('./ex1.csv',sep=',')
print(df)

输出:
   a   b   c   d message
0  1   2   3   4   hello
1  5   6   7   8   world
2  9  10  11  12     foo

读取没有标题的文件:

#文件内容
ex1.csv
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
#让pandas为其分配默认的列名
df = pd.read_csv('./ex1.csv', header=None)
print(df)

输出:
   0   1   2   3      4
0  1   2   3   4  hello
1  5   6   7   8  world
2  9  10  11  12    foo
#⾃⼰定义列名
names = ['a', 'b', 'c', 'd', 'message']  
df = pd.read_csv('./ex1.csv', names=names)
print(df)

输出:
   0   1   2   3      4
0  1   2   3   4  hello
1  5   6   7   8  world
2  9  10  11  12    foo

假设你希望将message列做成DataFrame的索引。你可以明确表 示要将该列放到索引4的位置上,也可以通过index_col参数指 定"message":

names = ['a', 'b', 'c', 'd', 'message']  
df = pd.read_csv('./ex1.csv', names=names,index_col=names[4])
print(df)

输出:
         a   b   c   d
message               
hello    1   2   3   4
world    5   6   7   8
foo      9  10  11  12

如果希望将多个列做成层次化索引,只需传⼊由列编号或列 名组成的列表即可

#文件内容
key1,key2,value1,value2
one,a,1,2
one,b,3,4
one,c,5,6
one,d,7,8
two,a,9,10
two,b,11,12
two,c,13,14
two,d,15,16
df = pd.read_csv('./ex1.csv', index_col=['key1', 'key2'])
print(df)
输出:
           value1  value2
key1 key2                
one  a          1       2
     b          3       4
     c          5       6
     d          7       8
two  a          9      10
     b         11      12
     c         13      14
     d         15      16

skiprows跳过文件的指定行

# hey!
a,b,c,d,message
# just wanted to make things more difficult for you
# who reads CSV files with computers, anyway?
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
df = pd.read_csv('./ex1.csv', skiprows=[0, 2, 3])
print(df)
输出:
   a   b   c   d message
0  1   2   3   4   hello
1  5   6   7   8   world
2  9  10  11  12     foo

逐块读取文本文件

在处理很⼤的⽂件时,或找出⼤⽂件中的参数集以便于后续处理时,你可能只想读取⽂件的⼀⼩部分或逐块对⽂件进⾏迭代。

如果只想读取⼏⾏(避免读取整个⽂件),通过nrows进⾏指定即可:

df = pd.read_csv('./ex1.csv', nrows=2)
print(df)
输出:#输出0 ,1 行
   1   2   3   4  hello
0  5   6   7   8  world
1  9  10  11  12    foo

处理分隔符格式

部分存储在磁盘上的表格型数据都能用pandas.read_table加载。有时还是需要做些处理。

import csv

f = open('./ex1.csv')
reader = csv.reader(f, delimiter=',')
for line in reader:
    print(line)

输出:
['1', '2', '3', '4', 'hello']
['5', '6', '7', '8', 'world']
['9', '10', '11', '12', 'foo']
['1', '2', '3', '4', 'hello']
['5', '6', '7', '8', 'world']
['9', '10', '11', '12', 'foo']

写入csv

DataFrame.to_csv(path_or_buf=None, sep=',', columns=None, header=True, index=True, index_label=None,mode='w', encoding=None)
  • path_or_buf:文件路径
  • sep:分隔符
  • columns:要保存的列,列表形式
  • header:默认为True,是否写进列索引值
  • index:是否写进行索引值
  • mode:w为重写,a为追加
  • series和dataframe操作基本一致
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!