Pandas:将 dbf Table 转换为数据帧

Pandas: transform a dbf Table into a dataframe

我想读取 ArcGIS shapefile 的 dbf 文件并将其转储到 pandas 数据框中。我目前正在使用 dbf 包。

我显然已经能够将 dbf 文件作为 Table 加载,但无法弄清楚如何解析它并将其转换为 pandas 数据帧. 有什么方法可以做到?

这是我卡在的地方:

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

Python returns 这条语句作为输出,坦率地说,我不知道该怎么做:

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

你应该看看 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。它将允许您执行最重要的 GIS 操作

http://geopandas.org/data_structures.html

使用 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中找出列名。

性能可能是个问题。我测试了上面和其他地方建议的一些库。对于我的测试,我使用了一个包含 17 列和 23 条记录 (7 kb) 的小型 dbf 文件。

包 simpledbf 有一个简单的方法 to_dataframe()。 dbfread 的 DBF table 对象的实际方面是可以通过将其作为参数添加到 Python 的内置函数 iter() 来对其进行迭代,其结果可以使用直接初始化数据框。对于 pysal,我使用了函数 dbf2DF,如 所述。我使用上面显示的方法将来自其他库的数据添加到数据框中。但是,只有在检索字段名称之后,我才能首先使用正确的列名称初始化数据框:分别从 fieldNames _meta.keys 和函数 ListFields 的方式。

可能添加记录1乘1并不是获得填充数据框的最快方法,这意味着使用DBFPY,DBF和ARCPY测试的方法将导致更有利的数字,而将选择更智能的方法将数据添加到将数据添加到该数据中数据框。尽管如此,我希望以下 table - 时间以秒为单位 - 有用:

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

我使用了在 PyPi 版本 0.99.1 上找到的 'dbf',效果很好。

import dbf
import pandas as pd

table = dbf.Table(filename=filepath)
table.open(dbf.READ_ONLY)
df = pd.DataFrame(table)
table.close()

print(df)

这对我有用:

import geopandas as gpd

df = gpd.read_file('some_file.dbf').drop("geometry",axis=1)