访问数据时使用各类工具的第一步,我们重点关注使用 pandas 进行数据输入和输出,输入和输出通常有以下几种类型:读取文本文件及硬盘上其他更高效的格式文件,从数据库中载入数据,与网络资源进行交互(比如 Web API )
将表格型数据读取为 dataframe 对象是pandas 的重要特性。
关于python对csv 文件的操作可以看看我以前的文章啊脑补链接
import csv
headers=('a','b','c','d','message')
data=[(1,2,3,4,'hello'),
(5,6,7,8,'world'),
(8,10,11,12,'foo')]
with open('ex2.csv','w',encoding='utf-8',newline='') as f:
writer=csv.writer(f)
writer.writerow(headers)
writer.writerows(data)
with open('ex2.csv','r',encoding='utf-8') as f: # 当然可以用excel 来创建一个表,再jupyter notebook 中
reader=csv.reader(f) # 使用 !type ex2.csv 来查看
for each in reader:
print(each)
['a', 'b', 'c', 'd', 'message']
['1', '2', '3', '4', 'hello']
['5', '6', '7', '8', 'world']
['8', '10', '11', '12', 'foo']
df=pd.read_csv('ex2.csv') # 使用read_csv 的方法读入 dataframe 中
df
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 8 10 11 12 foo
df=pd.read_table('ex2.csv',sep=',') # 我们也可以使用 read_table 方法并指定分隔符,
!type ex1.csv # 这个是不包含表头 行的
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
# 要读取这样的文件,需要选择一些选项,可利用允许pandas自动分配默认列名,也可以自己指定列名
pd.read_csv('ex1.csv',header=None)
0 1 2 3 4
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
pd.read_csv('ex1.csv')
1 2 3 4 hello # 这把第一行就当头了。。。
0 5 6 7 8 world
1 9 10 11 12 foo
pd.read_csv('ex1.csv',names=['a','b','c','d','message'])
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
# 如果你想要 message 列成为返回dataframe 的索引,你可以指定位置4 的列为索引,或‘message’ 传入 index_col
pd.read_csv('ex1.csv',names=['a','b','c','d','message'],index_col=4)
a b c d
message
hello 1 2 3 4
world 5 6 7 8
foo 9 10 11 12
!type ex1.csv
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
pd.read_csv('ex1.csv',index_col=['key1','key2']) # 从多个列中形成一个分层索引,需要传入一个包含列序号,列名的列表
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
list(open('ex3.txt')) # 这些字段通过不同数量的空格分开,传入一个正则作为分隔符
[' A B C\n', 'aaa 1 2 3\n', 'bbb 3 5 6\n', 'ccc 7 8 9\n', 'ddd 10 11 12\n']
pd.read_table('ex3.txt',sep='\s+') # 匹配空白字符
A B C
aaa 1 2 3 # 由于列名的数量比数据的列数少了一个,默认将第一列当作了dataframe 的索引。
bbb 3 5 6
ccc 7 8 9
ddd 10 11 12
# 解析函数有很多附加参数帮助你除了各种发生异常的文件格式
list(open('ex3.csv',encoding='utf-8'))
['# 额\n',
' A B C\n',
' # 可不可以把我去了\n',
' # 啊\n',
'aaa 1 2 3\n',
'bbb 3 5 6\n',
'ccc 7 8 9\n',
'ddd 10 11 12\n']
pd.read_csv('ex3.csv',skiprows=[0,2,3]) # 跳过这三行
A B C
0 aaa 1 2 3
1 bbb 3 5 6
2 ccc 7 8 9
3 ddd 10 11 12
# 缺失值要么不显示,要么用一些标识值,pandas 中常用 NA NULL
!type ex2.csv
a,b,c,d,message
1,2,3,4,hello
5,6,7,8,world
8,10,11,12,foo
13,NA,15,16,NA
result=pd.read_csv('ex2.csv')
a b c d message
0 1 2.0 3 4 hello
1 5 6.0 7 8 world
2 8 10.0 11 12 foo
3 13 NaN 15 16 NaN
pd.isnull(result)
a b c d message
0 False False False False False
1 False False False False False
2 False False False False False
3 False True False False True
pd.read_csv('ex2.csv',na_values=['hello']) # 需要NA 来替换的序列
a b c d message
0 1 2.0 3 4 NaN # 这里把原来的 hello 替换成了 NAN
1 5 6.0 7 8 world
2 8 10.0 11 12 foo
3 13 NaN 15 16 NaN
sentinels={'message':['hello','foo'],'a':[1]} # 再字典中,每列可以指定不同的缺失值标识
pd.read_csv('ex2.csv',na_values=sentinels)
a b c d message
0 NaN 2.0 3 4 NaN
1 5.0 6.0 7 8 world
2 8.0 10.0 11 12 NaN
3 13.0 NaN 15 16 NaN
当处理大型文件或找出正确的参数集来正确处理大文件时,你可能需要读入文件的一个小片段或者按照小块遍历文件。
再尝试大文件之前,我们可以先对pandas 的显示设置进行调整,使之更加紧凑。
pd.options.display.max_rows=10
pd.read_csv('ex6.csv') # 额,10000行,确实是大文件。https://github.com/wesm/pydata-book 可以下载下来看看
one two three four key
0 0.467976 -0.038649 -0.295344 -1.824726 L
1 -0.358893 1.404453 0.704965 -0.200638 B
2 -0.501840 0.659254 -0.421691 -0.057688 G
3 0.204886 1.074134 1.388361 -0.982404 R
4 0.354628 -0.133116 0.283763 -0.837063 Q
... ... ... ... ... ...
9995 2.311896 -0.417070 -1.409599 -0.515821 L
9996 -0.479893 -0.650419 0.745152 -0.646038 E
9997 0.523331 0.787112 0.486066 1.093156 K
9998 -0.362559 0.598894 -1.843201 0.887292 G
9999 -0.096376 -1.012999 -0.657431 -0.573315 NaN
10000 rows × 5 columns
pd.read_csv('ex6.csv',nrows=5) # 只读取前五行
chunker=pd.read_csv('ex6.csv',chunksize=1000) # 分块,指定chunksize 作为每一块的行数,
chunker
<pandas.io.parsers.TextFileReader at 0x1868c0319c8>
# read_csv 返回的 TextParser 对象允许你根据 chunksize 历遍文件。
# 例如,我们历遍 ex6.csv 并对 'key' 列聚合获得计数值
tot=pd.Series([])
for piece in chunker:
tot=tot.add(piece['key'].value_counts(),fill_value=0) # 就是获得key 列各值的个数,,
tot=tot.sort_values(ascending=False)
tot[:10]
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
有内味了。。。。。。。