文件读取与存储
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操作基本一致
来源:oschina
链接:https://my.oschina.net/u/3696975/blog/3214835