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

10

Wes がメールで返信してくれました。乾杯。

これは固定幅形式のファイルです (通常のようにコンマやタブで区切られていません)。pandas には R のような固定幅のリーダーがないことを認識していますが、非常に簡単に作成できます。何ができるか見てみます。それまでの間、データを別の形式 (csv など、完全にカンマ区切り) でエクスポートできる場合は、read_csv で読み取ることができます。UNIX マジックを使えば、FWF ファイルを CSV ファイルに変換できるのではないかと思います。

あなたの電子メールが私の受信トレイから消えようとしているので、github の問題をフォローすることをお勧めします :)

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

最高、ウェス

于 2012-03-16T01:26:47.190 に答える
0

ディスプレイとはどういう意味ですか?gvkey列のデータが表示されませdf['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()
于 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 に答える