生活の跡

個人的な備忘録

arcpy で Exception: Data must be 1-dimensional が出た

概要

ArcGISでフィーチャクラスのデータを調べようと思い、
Pandasのデータフレームに変換しようとしたら
Exception: Data must be 1-dimensional というエラーがでました。
ちなみに、Jupyter Notebook で操作しています。

詳細

以前こちらの記事で試したときは、
抽出するフィールドを指定していました。
ArcGISのテーブル属性をpythonで加工してcsv出力する - 生活の跡

今回は同じ方法ですべてのフィールドを抽出します。
ArcGISのヘルプを見ると、アスタリスク(*)で指定できそうです。
FeatureClassToNumPyArray—Help | ArcGIS for Desktop

そこで、FeatureClassToNumPyArray の第二引数を('*')にして実行します。
しかし、その返り値をデータフレームに変換するところでエラー発生。

# すべてのフィールドのデータをNumPyArray形式で取得
arr = arcpy.da.FeatureClassToNumPyArray(input, ('*'))

# NumPyArray形式から、Pandasのデータフレーム形式に変換(ここでエラー)
df = pd.DataFrame(arr)

原因

エラー内容は「1次元のデータを渡してくれよな!」ということなので、
配列みたいなフィールドが含まれている様子。

フィールドの定義を調べると、
「Shape」フィールドのデータタイプが「Geometry」となっていました。
f:id:ishii-akihiro:20180731102630p:plain

試しに「Shape」フィールドだけ抽出すると、データフレームに変換できず。
そこでNumPyArrayに変換した「Shape」フィールドの内容を見てみると、
array([ 30955.39953296, 160019.27469464]) という配列になっていました。

ArcGISのヘルプを見ると、フィーチャの重心のx、y座標のようです。
FeatureClassToNumPyArray—Help | ArcGIS for Desktop

つまり、データタイプが「Geometry」であるフィールドを
除外すればよさそうです。

解決方法

FeatureClassToNumPyArray の第二引数を、
データタイプが「Geometry」でないフィールドのリストに変更します。

# ListFields 関数で Field オブジェクトのリストを作成
fields = arcpy.ListFields(input)

# データタイプが「Geometry」でないフィールド名のリストを生成
nameList = [fld.name for fld in fields if fld.type != 'Geometry']

# すべてのフィールドのデータをNumPyArray形式で取得
arr = arcpy.da.FeatureClassToNumPyArray(input, nameList)

# NumPyArray形式から、Pandasのデータフレーム形式に変換
df = pd.DataFrame(arr)

# 確認
df

参考

blog.esrij.com community.esri.com