2017-03-28 2 views
1

今、変数空白区切り文字と欠落/空白値を持つテーブルを読み込もうとしています。私はPythonでテーブルを読んで、CSVファイルを生成したいと思います。私はNumPy、Pandas、CSVライブラリを試しましたが、残念ながら変数空間と欠けているデータが一緒になってテーブルを読むことが不可能に近づいています。私は読んしようとしているファイルはここに添付されています goo.gl/z7S2MoPythonで変数の空白区切りテーブルを読む

This is how the table looks like

は誰のpython

+3

(それは非常に難しいだろう)、「固定幅」の列も空白値で区切られた変数ではない空白に見えます。 フィールド幅ごとにサブストリングを使用し、トリミングする必要があります。 –

+0

固定幅であるかどうかを確認しようとしていますが、テーブルをExcelで読み込もうとしていて、テーブルが正しく取り込まれていないために固定幅であることを示唆しています。 –

+1

Excelが間違っていた私の目は私に教えてくれます;-) –

答えて

1

に溶液で私を助けることができる場合numpyのモジュールがする機能を持っている本当にお願い申し上げただそれは、(最後の行を参照)ん:

import numpy as np 

path = "<insert file path here>/infotable.txt" 

# read off column locations from a text editor. 
# I used Notepad++ to do that. 
column_locations = np.array([1, 38, 52, 61, 70, 78, 98, 111, 120, 127, 132]) 

# My text editor starts counting at 1, while numpy starts at 0. Fixing that: 
column_locations = column_locations - 1 

# Get column widths 
widths = column_locations[1:] - column_locations[:-1] 

data = np.genfromtxt(path, dtype=None, delimiter=widths, autostrip=True) 

をあなたの正確なユースケースに応じて、列幅を取得するために別の方法を使用するかもしれませんが、あなたのアイデアを得ます。 dtype=Noneは、numpyによって確実にデータ型が決定されます。これは引数dtypeを省略したのとは非常に異なります。最後に、autostrip=Trueは先頭と末尾の空白を削除します。

出力(data)はstructured arrayです。

+0

ありがとうたくさんの@Joooeey –

+0

ナンシーはこれらすべての文字列だと思う。値、shrs、および投票列が整数である必要がありますか? – Joooeey

+0

空の列の場所を追加すると、それでも機能するはずです。試してみて、答えを更新してください。 – Joooeey

2

デリミタは2つ以上のスペース(1つ以上のスペースではなく)にする必要があります。ここソリューションです:

import pandas as pd 
df = pd.read_csv('infotable.txt',sep='\s{2,}',header=None,engine='python',thousands=',') 

結果:

>>> print(df.head()) 
           0    1   2  3  4 5 \ 
0 ISHARES MORNINGSTAR MID GROWTH   ETP 464288307 3892 41700 SH 
1 ISHARES S&P MIDCAP 400 GROWTH   ETP 464287606 4700 47600 SH 
2    BED BATH & BEYOND Common Stock 075896100 870 15000 SH 
3    CARBO CERAMICS INC Common Stock 140781105 950 7700 SH 
4 CATALYST HEALTH SOLUTIONS IN Common Stock 14888B103 1313 25250 SH 

     6  7 8 9 
0 Sole 41700 0 0 
1 Sole 47600 0 0 
2 Sole 15000 0 0 
3 Sole 7700 0 0 
4 Sole 25250 0 0 

>>> print(df.dtypes) 
0 object 
1 object 
2 object 
3  int64 
4  int64 
5 object 
6 object 
7  int64 
8  int64 
9  int64 
dtype: object 
関連する問題