我只是抓住了大熊猫,并想知道如何阅读文件。该文件来自WRDS数据库,是回到20世纪60年代的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)
上面的输出块是什么意思?一切都会有所帮助
答案 0 :(得分:10)
pandas.read_fwf()
来处理固定宽度的文件。
答案 1 :(得分:8)
韦斯在一封电子邮件中回答我。干杯。
这是一个固定宽度格式的文件(不用逗号或制表符分隔) 通常)。我意识到大熊猫没有固定宽度的读卡器 R确实如此,虽然可以很容易地制作出一个。我会看到我能做到的 做。在此期间,如果您可以以其他格式导出数据(例如 csv - 真正用逗号分隔)你将能够用read_csv读取它。一世 怀疑有一些unix魔法你可以将FWF文件转换为CSV 文件。
我建议您在github上关注该问题,因为您的电子邮件即将发布 从我的收件箱中消失:)
https://github.com/pydata/pandas/issues/920
最好的, 韦斯
答案 2 :(得分: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()
答案 3 :(得分: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
如果您现在需要它,这应该可以解决问题,但请记住上面的函数非常简单,特别是它对数据类型没有任何作用。