Pandas:将dbf表转换为数据帧

时间:2017-01-27 16:25:58

标签: python pandas dataframe arcgis dbf

我想阅读ArcGIS shapefile的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
...   ...      ...            ...

6 个答案:

答案 0 :(得分:20)

您应该查看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文件。希望有所帮助。

答案 1 :(得分:5)

如mmann1123所述,可以使用geopandas来读取dbf文件。地理熊猫会读取它,即使它可能具有或不具有地理空间数据。

假设您的数据只是表格数据(没有地理坐标),并且您希望读取它并将其转换为熊猫图书馆可以读取的格式,我建议您使用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

答案 2 :(得分:3)

您可能想看一下地理分布。它将允许您执行最重要的GIS操作

http://geopandas.org/data_structures.html

答案 3 :(得分:2)

如何使用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找到列名。

答案 4 :(得分:2)

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

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

可能将记录一对一地添加不是获得填充数据框的最快方法,这意味着当选择一种更聪明的方法将数据添加到数据框时,使用dbfpy,dbf和arcpy进行的测试将产生更有利的数据。一样,我希望下表(以秒为单位的时间)有用:

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

答案 5 :(得分:0)

我使用了 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)