Pandas: преобразование таблицы dbf в фрейм данных

Я хочу прочитать dbf файл шейп-файла ArcGIS и сбросьте его в pandas таблицы данных. В настоящее время я использую dbf.

Я, по-видимому, смог загрузить dbf файл в виде таблицы, но не смогли понять, как его разобрать и превратить в фрейм данных pandas. как это сделать?

вот где я застрял:

import dbf
thisTable = dbf.Table('C:Usersmyfolderprojectmyfile.dbf')
thisTable.open(mode='read-only')

Python возвращает этот оператор в качестве вывода, который я откровенно не знаю, что делать:

dbf.ver_2.Table('C:Usersmyfolderprojectmyfile.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
...   ...      ...            ...

5 ответов


вы должны взглянуть на 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. Надеюсь, это поможет.


вы можете посмотреть на geopandas. Это позволит вам выполнять наиболее важные операции ГИС

http://geopandas.org/data_structures.html


Как насчет использования dbfpy? Вот пример, который показывает, как загрузить dbf с 3 столбцами в фрейм данных:

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

при необходимости вы можете узнать имена столбцов из БД.поля.


производительность может быть проблемой. Я протестировал несколько библиотек, предложенных выше и в других местах. Для моего теста я использовал небольшой dbf-файл из 17 столбцов и 23 записей (7 КБ).

пакет simpledbf имеет простой метод to_dataframe (). И практическим аспектом объекта таблицы DBF dbfread является возможность просто перебирать его, добавляя его в качестве аргумента к встроенной функции ITER () Python, результат которой может быть использован для непосредственной инициализации фрейма данных. В в случае пысал, я использовал dbf2DF функции, как описано здесь. Данные из других библиотек я добавил в dataframe с помощью метода, показанного выше. Однако только после извлечения имен полей, чтобы я мог инициализировать фрейм данных сначала именами правых столбцов: из имен полей _meta.ключи и с помощью функции ListFields соответственно.

вероятно, добавление записей 1 на 1-не самый быстрый способ получить заполненный фрейм данных, что означает, что тесты с dbfpy, dbf и arcpy приведут к более благоприятным цифрам, когда будет выбран более умный способ добавления данных в фрейм данных. Тем не менее, я надеюсь, что следующая таблица - со временем в секундах - полезна:

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

Как заявил mmann1123, вы можете использовать geopandas для чтения файла 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 collumns 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