概要
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」となっていました。
試しに「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