2012-03-15 67 views
9

我刚刚掌握了熊猫的基本知识,并计算出如何读取文件。该文件来自WRDS数据库,并且是SP500成分列表,一直延续到20世纪60年代。我检查了这个文件,无论我使用'read_csv'导入它,我仍然无法正确显示数据。我如何在熊猫中读取修正宽度格式的文本文件

df = read_csv('sp500-sb.txt') 

df 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 1231 entries, 0 to 1230 
Data columns: gvkeyx      from      thru     conm 
                                        gvkey      co_conm 
...(the column names) 
dtypes: object(1) 

上面的输出块是什么意思?任何事情会有帮助

+2

,大熊猫可以吃你的数据? – hochl 2012-03-15 14:12:59

+1

你能显示文件的前几行吗? – 2012-03-15 14:41:02

回答

7

Wes在电子邮件中回答我。干杯。

这是一个固定宽度格式的文件(没有用逗号或制表符分隔,通常为 )。我意识到熊猫没有固定宽度的阅读器,比如 R,尽管可以非常容易地塑造熊猫。我会看看我能做什么 。与此同时,如果您可以导出另一种格式的数据(如 csv - 真正的逗号分隔),您可以使用read_csv读取它。我 怀疑与一些Unix魔术,你可以将一个FWF文件转换为一个CSV文件 。

我建议以下GitHub上的问题,因为你的电子邮件即将 从我的收件箱:)

https://github.com/pydata/pandas/issues/920

最好, 韦斯

+6

追踪答案。读取修正宽度格式现在由read_fwf()实现。请参阅http://pandas.pydata.org/pandas-docs/dev/io.html#files-with-fixed-width-columns – 2012-12-11 19:15:46

0

你是什么意思显示? df['gvkey']不会给你gvkey列中的数据吗?

如果您要将整个数据框输出到控制台,请查看df.to_string(),但如果列数过多,则很难阅读。如果列数过多,熊猫将不会打印整个东西:

import pandas 
import numpy 

df1 = pandas.DataFrame(numpy.random.randn(10, 3), columns=['col%d' % d for d in range(3)]) 
df2 = pandas.DataFrame(numpy.random.randn(10, 30), columns=['col%d' % d for d in range(30)]) 

print df1 # <--- substitute by df2 to see the difference 
print 
print df1['col1'] 
print 
print df1.to_string() 
+0

谢谢TR。我的数据文件是固定宽度格式...目前不支持。韦斯慷慨地添加到源伪造熊猫问题列表。 – user1234440 2012-03-16 01:28:01

+0

你还能访问WRDS吗?您应该有一个选项以csv格式输出文件。 – 2012-03-17 19:55:32

0

用户消失,如果你需要处理与现在的固定格式,你可以使用类似如下:

def fixed_width_to_items(filename, fields, first_column_is_index=False, ignore_first_rows=0): 
    reader = open(filename, 'r') 
    # skip first rows 
    for i in xrange(ignore_first_rows): 
     reader.next() 
    if first_column_is_index: 
     index = slice(0, fields[1]) 
     fields = [slice(*x) for x in zip(fields[1:-1], fields[2:])] 
     return ((line[index], [line[x].strip() for x in fields]) for line in reader) 
    else: 
     fields = [slice(*x) for x in zip(fields[:-1], fields[1:])] 
     return ((i, [line[x].strip() for x in fields]) for i,line in enumerate(reader)) 

这是在EST程序:

import pandas 
import numpy 
import tempfile 

# create a data frame 
df = pandas.DataFrame(numpy.random.randn(100, 5)) 
file_ = tempfile.NamedTemporaryFile(delete=True) 
file_.write(df.to_string()) 
file_.flush() 

# specify fields 
fields = [0, 3, 12, 22, 32, 42, 52] 
df2 = pandas.DataFrame.from_items(fixed_width_to_items(file_.name, fields, first_column_is_index=True, ignore_first_rows=1)).T 

# need to specify the datatypes, otherwise everything is a string 
df2 = pandas.DataFrame(df2, dtype=float) 
df2.index = [int(x) for x in df2.index] 

# check 
assert (df - df2).abs().max().max() < 1E-6 

这应该做的,如果你需要它现在的伎俩,但请记住,上面的功能很简单,尤其是它没有做有关数据类型的东西。