2013-07-19 6 views
7

私はpandasには新しく、これはstackoverflowに関する最初の質問です。私はpandasでいくつかの分析をしようとしています。複数のdictsからpandas DataFrameを作成

処理したいデータレコードを持つテキストファイルがあります。ファイルの各行は、固定された場所にあり、長さが固定の文字数のレコードに一致します。同じファイルにはさまざまな種類のレコードがあり、すべてのレコードはレコードの種類に応じて2文字の最初のフィールドを共有します。例として:

Some file: 
01Jhon  Smith  555-1234           
03Cow   Bos primigenius taurus  00401     
01Jannette Jhonson   00100000000        
... 


field start length 
type   1  2 *common to all records, example: 01 = person, 03 = animal 
name   3  10 
surname  13  10 
phone  23  8 
credit  31  11 
fill of spaces 

私は辞書に一つのレコードを変換するためにいくつかのコードを書いている:

person1 = {'type': 01, 'name': = 'Jhon', 'surname': = 'Smith', 'phone': '555-1234'} 
person2 = {'type': 01, 'name': 'Jannette', 'surname': 'Jhonson', 'credit': 1000000.00} 
animal1 = {'type': 03, 'cname': 'cow', 'sciname': 'Bos....', 'legs': 4, 'tails': 1 } 

フィールドが空の場合(スペースで埋め)辞書には存在しません) 。

1種類のすべてのレコードで、dictsキーを列名として使用してpandas DataFrameを作成したいのですが、pandas.DataFrame.from_dict()を使用して成功を収めてみました。

ここに私の質問が来る:パンダでこれを行う方法はdictキーが列名になるので?この種のファイルに対処する他の標準的な方法はありますか?

答えて

7

辞書からのデータフレームを作成するには、辞書のリスト渡すことができます混在の異なる2つの形式のファイルのより根本的な問題については

>>> person1 = {'type': 01, 'name': 'Jhon', 'surname': 'Smith', 'phone': '555-1234'} 
>>> person2 = {'type': 01, 'name': 'Jannette', 'surname': 'Jhonson', 'credit': 1000000.00} 
>>> animal1 = {'type': 03, 'cname': 'cow', 'sciname': 'Bos....', 'legs': 4, 'tails': 1 } 
>>> pd.DataFrame([person1]) 
    name  phone surname type 
0 Jhon 555-1234 Smith  1 
>>> pd.DataFrame([person1, person2]) 
    credit  name  phone surname type 
0  NaN  Jhon 555-1234 Smith  1 
1 1000000 Jannette  NaN Jhonson  1 
>>> pd.DataFrame.from_dict([person1, person2]) 
    credit  name  phone surname type 
0  NaN  Jhon 555-1234 Smith  1 
1 1000000 Jannette  NaN Jhonson  1 

を、と仮定したファイルはそうではありません私はそれらを読めず、メモリに格納することができませんでした。私はStringIOを使ってファイルのようなものですが、私たちが望む行だけを持つオブジェクトを作成し、read_fwf(固定幅ファイル) 。たとえば:

from StringIO import StringIO 

def get_filelike_object(filename, line_prefix): 
    s = StringIO() 
    with open(filename, "r") as fp: 
     for line in fp: 
      if line.startswith(line_prefix): 
       s.write(line) 
    s.seek(0) 
    return s 

、その後

>>> type01 = get_filelike_object("animal.dat", "01") 
>>> df = pd.read_fwf(type01, names="type name surname phone credit".split(), 
        widths=[2, 10, 10, 8, 11], header=None) 
>>> df 
    type  name surname  phone  credit 
0  1  Jhon Smith 555-1234  NaN 
1  1 Jannette Jhonson  NaN 100000000 

は動作するはずです。もちろん、あなたはpandasがそれらを見る前にファイルを別々のタイプに分けることもできます。これはすべての中で最も簡単かもしれません。

+0

ありがとうございます。_list of_dictsがキーです。ファイルは数百Mbsのgzip圧縮され、いくつかのGbsは圧縮されていないので、行単位で読み込み、対応するDataFrameに追加します。 – tinproject

関連する問題