我想阅读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
... ... ... ...
答案 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操作
答案 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)