利用python进行数据分析-数据加载、存储与文件格式1

1.读写文本格式的数据

pandas提供了一些将表格型数据读取为DataFrame对象的函数

大致介绍下这些函数在将文本数据转换为DataFrame时所用到的一些技术。这些函数的选项可以划分为以下几个大类

df=pd.read_csv('ex1.csv')
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

我们也可以用read_table,只不过需要指定分隔符

print pd.read_table('ex1.csv',sep=',')

并不是所有文件都有标题行,读入该文件的方法有2个。可以让pandas为其分配默认的列名,也可以自定义列名

print pd.read_csv('data/ex2.csv',header=None)
print pd.read_csv('data/ex2.csv',names=['a','b','c','d','message'])

结果为:

   0   1   2   3      4
0  1   2   3   4  hello
1  5   6   7   8  world
2  9  10  11  12    foo
   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的索引。

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

结果为:

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

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

parsed=pd.read_csv('data/csv_mindex.csv',index_col=['key1','key2'])
print parsed

结果为:

           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

有些表格可能不是固定的分隔符去分隔字段的。对于这种情况,可以编写一个正则表达式来作为read_table的分隔符

result=pd.read_table('data/ex3.txt',sep='\s+')
print result

结果为:

            A         B         C
aaa -0.264438 -1.026059 -0.619500
bbb  0.927272  0.302904 -0.032399
ccc -0.264273 -0.386314 -0.217601
ddd -0.871858 -0.348382  1.100491

这些解析器函数还有许多参数可以帮助你处理各种各样的异形文件格式。比如说,你可以用skiprows跳过文件的第一行、第三行和第四行

print pd.read_csv('data/ex4.csv',skiprows=[0,2,3])

结果为:

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

缺失值处理是文件解析任务中的一个重要组成部分。默认情况下,pandas会用一组经常出现的标记值进行识别,如NA、-1.#IND以及NULL等

result2=pd.read_csv('data/ex5.csv')
print result2
print pd.isnull(result2)

结果为:

  something  a   b   c   d message
0       one  1   2   3   4     NaN
1       two  5   6 NaN   8   world
2     three  9  10  11  12     foo
  something      a      b      c      d message
0     False  False  False  False  False    True
1     False  False  False   True  False   False
2     False  False  False  False  False   False

na_values可以接受一组用于表示缺失值的字符串

result3=pd.read_csv('data/ex5.csv',na_values=['NULL'])
print result3

结果为:

  something  a   b   c   d message
0       one  1   2   3   4     NaN
1       two  5   6 NaN   8   world
2     three  9  10  11  12     foo

可以用一个字典为各列指定不同的NA标记值

sentinels={'message':['foo','NA'],'something':['two']}
print pd.read_csv('data/ex5.csv',na_values=sentinels)

结果为:

  something  a   b   c   d message
0       one  1   2   3   4     NaN
1       NaN  5   6 NaN   8   world
2     three  9  10  11  12     NaN



2.逐块读取文本文件

result4=pd.read_csv('data/ex6.csv',nrows=5)
print result4

结果为:

        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

要逐块读取文件,需要设置chunksize(行数)

chunker=pd.read_csv('data/ex6.csv',chunksize=1000)
print chunker

结果为:

<pandas.io.parsers.TextFileReader object at 0x00000000092BFC18>

read_csv所返回的这个TextParser对象使你可以根据chunksize对文件进行逐块迭代。比如,我们可以迭代处理ex6.csv,将值计数聚合到“key”列中

chunker=pd.read_csv('data/ex6.csv',chunksize=1000)
tot=Series([])
for piece in chunker:
    tot=tot.add(piece['key'].value_counts(),fill_value=0)
tot=tot.order(ascending=False)
print tot[:10]

结果为:

E    368
X    364
L    346
O    343
Q    340
M    338
J    337
F    335
K    334
H    330
dtype: float64

TextParser还有一个get_chunk方法,它使你可以读取任意大小的块


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值