2012-03-15 68 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 

這應該做的,如果你需要它現在的伎倆,但請記住,上面的功能很簡單,尤其是它沒有做有關數據類型的東西。