web-dev-qa-db-ja.com

パンダ:dbfテーブルをデータフレームに変換する

ArcGISシェープファイルのdbfファイルを読み取り、pandasデータフレームにダンプします。現在、 dbf パッケージを使用しています。

明らかにdbfファイルをテーブルとしてロードできましたが、それを解析してpandasデータフレームに変換する方法を理解できませんでした。- その方法は?

これは私が立ち往生している場所です:

_import dbf
thisTable = dbf.Table('C:\\Users\\myfolder\\project\\myfile.dbf')
thisTable.open(mode='read-only')
_

Pythonはこのステートメントを出力として返しますが、何を作成すればよいかわかりません。

dbf.ver_2.Table('C:\\Users\\myfolder\\project\\myfile.dbf', status='read-only')


編集

元のdbfのサンプル:

_FID   Shape    E              N
0     Point    90089.518711   -201738.245555
1     Point    93961.324059   -200676.766517
2     Point    97836.321204   -199614.270439
...   ...      ...            ...
_
15
FaCoffee

simpledbf をご覧ください。

In [2]: import pandas as pd

In [3]: from simpledbf import Dbf5

In [4]: dbf = Dbf5('test.dbf')

In [5]: df = dbf.to_dataframe()

これは、小さなサンプルの.dbfファイルで機能します。お役に立てば幸いです。

24
Fabio Lamanna

Mmann1123が述べたように、dbfファイルを読み取るためにジオパンダを使用できます。 Geopandasは、地理空間データがある場合とない場合でも、読み取ります。

データが表形式のデータのみであり(地理座標が設定されていない)、それを読み取ってpandasライブラリが読み取れる形式に変換する場合、geopandasを使用することをお勧めします。

次に例を示します。

import geopandas as gpd

My_file_path_name = r'C:\Users\...file_dbf.dbf'

Table = gpd.read_file(Filename)

import pandas as pd
Pandas_Table = pd.DataFrame(Table)

Keys = list(Table.keys())
Keys.remove('ID_1','ID_2') # removing ID attributes from the Table keys list
Keys.remove('Date') # eventually you have date attribute which you wanna preserve.

DS = pd.melt(Pandas_Table, 
             id_vars =['ID_1','ID_2'], # accepts multiple filter/ID values 
             var_name='class_fito', # Name of the variable which will aggregate all columns from the Table into the Dataframe
             value_name ='biomass (mg.L-1)' , # name of the variable in Dataframe
             value_vars= Keys # parameter that defines which attributes from the Table are a summary of the DataFrame)

# checking your DataFrame:

type(DS)   # should appear something like: pandas.core.frame.DataFrame

あなたはジオパンダを見たいと思うかもしれません。最も重要なGIS操作を行うことができます

http://geopandas.org/data_structures.html

4
mmann1123

dbfpy を使用してはどうですか?以下は、3列のdbfをデータフレームにロードする方法を示す例です。

from dbfpy import dbf
import pandas as pd

df = pd.DataFrame(columns=('tileno', 'grid_code', 'area'))
db = dbf.Dbf('test.dbf')
for rec in db:
    data = []
    for i in range(len(rec.fieldData)):
        data.append(rec[i])
    df.loc[len(df.index)] = data
db.close()

必要に応じて、db.fieldNamesから列名を見つけることができます。

2
Dobedani

パフォーマンスが問題になる場合があります。上記および他の場所で提案されたライブラリのいくつかをテストしました。私のテストでは、17列と23レコード(7 kb)の小さなdbfファイルを使用しました。

パッケージsimpledbfには、単純なメソッドto_dataframe()があります。また、dbfreadのDBFテーブルオブジェクトの実用的な側面は、Pythonの組み込み関数iter()に引数として追加することにより、反復するだけで、その結果を使用してデータフレームを直接初期化できることです。 pysalの場合、記述された here のように関数dbf2DFを使用しました。上記の方法を使用して、データフレームに追加した他のライブラリのデータ。ただし、フィールド名を取得した後にのみ、最初に正しい列名でデータフレームを初期化できます。fieldNames、_meta.keysから、およびそれぞれ関数ListFieldsを使用して。

おそらく、1つずつレコードを追加することは、いっぱいになったデータフレームを取得するための最速の方法ではありません。つまり、データをデータフレームに追加するスマートな方法を選択する場合、dbfpy、dbf、およびarcpyでテストすると、より有利な数値が得られます。それでも同じように、次の表(時間は秒単位)が役立つことを願っています。

simpledbf   0.0030
dbfread     0.0060
dbfpy       0.0140
pysal       0.0160
dbf         0.0210
arcpy       2.7770
2
Dobedani