python Pandas:将dbf表转换为 Dataframe

3wabscal  于 2022-12-25  发布在  Python
关注(0)|答案(8)|浏览(521)

我想读取ArcGIS shapefile的dbf文件并将其转储到pandas数据框中。我当前使用的是dbf包。
我显然已经能够将dbf文件作为表加载,但还不知道如何解析它并将其转换为panda Dataframe 。该如何操作?
这就是我的困惑所在:

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

yrwegjxp1#

您应该看看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文件。

0h4hbjxa

0h4hbjxa2#

正如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
vjrehmav

vjrehmav3#

您可能需要查看geopandas。它允许您执行最重要的GIS操作
http://geopandas.org/data_structures.html

7bsow1i6

7bsow1i64#

性能可能是一个问题。我测试了上面和其他地方建议的一些库。在我的测试中,我使用了一个17列和23条记录(7 KB)的小dbf文件。
simpledbf包有一个简单的方法to_dataframe dbfread的DBF表对象的实用性在于,可以通过将其作为参数添加到Python的内置函数iter中来对其进行迭代(),其结果可用于直接初始化 Dataframe 。在pysal的情况下,我使用了函数dbf2DF,如here所述。我使用上面所示的方法将其他库中的数据添加到数据框中。但是,只有在检索字段名称之后,我才能首先使用正确的列名初始化数据框:分别从fieldNames、_ meta.keys和通过函数ListFields获取。
也许逐个添加记录并不是获得填充 Dataframe 的最快方法,这意味着当选择更聪明的方法将数据添加到 Dataframe 时,使用dbfpy、dbf和arcpy进行测试会得到更有利的数据。尽管如此,我希望下表(时间以秒为单位)有用:

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

oo7oh9g95#

使用dbfpy怎么样?下面的例子展示了如何将一个包含3列的dbf加载到 Dataframe 中:

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中找到列名。

jq6vz3qz

jq6vz3qz6#

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

rdrgkggo7#

这对我很有效:

import geopandas as gpd

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

bttbmeg08#

如何将DBF文件的内容加载到Pandas数据框中。
iter()是必需的,因为Pandas没有检测到DBF对象是可迭代的。

#import
from dbfread import DBF
import pandas as pd

dbf = DBF('people.dbf')
dataResult = pd.DataFrame(iter(dbf))

print(dataResult)

相关问题