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 操作
使用 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)
我想读取 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 操作
使用 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,如
可能添加记录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)