31

私はパンダが初めてで、それがスタックオーバーフローに関する最初の質問です。パンダで分析を行おうとしています。

処理したいデータ レコードを含むテキスト ファイルがいくつかあります。ファイルの各行は、フィールドが固定位置にあり、固定長の文字数を持つレコードに一致します。同じファイルにはさまざまな種類のレコードがあり、すべてのレコードは、レコードの種類に応じて 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

1 つのレコードを辞書に変換するコードを書いています。

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() を試してみましたが成功しませんでした。

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

4

1 に答える 1

41

辞書から DataFrame を作成するには、辞書のリストを渡すことができます。

>>> 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

2 つの異なる形式のファイルが混在しているというより根本的な問題については、ファイルがそれほど大きくないため、ファイルを読み取ってメモリに保存できないと仮定するとStringIO、ファイルのようなオブジェクトを作成するために使用します。しかし、これには必要な行だけが含まれており、read_fwf(fixed-width-file) を使用します。例えば:

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見る前にさまざまなタイプに分けることもできます。これが最も簡単な方法です。

于 2013-07-19T17:35:43.543 に答える