14

我刚刚接触了熊猫,正在研究如何读取文件。该文件来自 WRDS 数据库,是自 1960 年代以来的 SP500 成分列表。我检查了文件,无论我做什么来导入它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)

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

4

4 回答 4

21

pandas.read_fwf()在 pandas 0.7.3(2012 年 4 月)中添加以处理固定宽度文件。

  1. API 参考

  2. 其他问题的一个例子

于 2015-10-27T06:15:47.027 回答
10

韦斯在一封电子邮件中回复了我。干杯。

这是一个固定宽度格式的文件(不是像往常一样用逗号或制表符分隔)。我意识到 pandas 没有像 R 那样的固定宽度阅读器,尽管可以很容易地制作出来。我会看看我能做什么。同时,如果您可以以另一种格式导出数据(例如 csv——真正的逗号分隔),您将能够使用 read_csv 读取它。我怀疑通过一些 unix 魔法,您可以将 FWF 文件转换为 CSV 文件。

我建议关注 github 上的问题,因为您的电子邮件即将从我的收件箱中消失 :)

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

最好的,韦斯

于 2012-03-16T01:26:47.190 回答
0

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

如果您所做的是将整个数据框打印到控制台,请查看df.to_string(),但如果您的列太多,则很难阅读。如果列太多,Pandas 默认不会打印整个内容:

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()
于 2012-03-15T23:28:51.627 回答
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)) 

这是一个测试程序:

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

如果您现在需要它,这应该可以解决问题,但请记住,上面的函数非常简单,特别是它对数据类型没有任何作用。

于 2012-03-17T19:53:59.067 回答