QGISで地図にCSVを結合したのに、追加した列がNULLになる。見た目では同じ地域コードなのに一致しない。今回は、こうしたときに確認したい「結合キー」「先頭の0」「データ型」を、4地区の架空データで整理します。
属性データの色分けの基本はQGISで属性データを可視化する ポリゴン編で紹介しています。本記事は、その前段階となるCSVの結合を確実にするための補足です。画面はQGIS 3.28.15の日本語表示で撮影した例です。利用するバージョンでは項目名や配置が異なる場合があります。
1.4地区のサンプルを用意する
地区ポリゴンと修正前・修正後のCSVをダウンロード(ZIP)。解凍してから利用してください。教材は本記事用に作成した架空データで、自由に改変・再配布できます。
解凍すると、zones.geojson、population_bad.csv、population_clean.csvと、各CSVに対応するcsvtファイルがあります。地区の形と人口はすべて架空です。実際の市区町村コードではなく、練習用に5桁の地区コードを使っています。
| 地図側のcode | 地区名 | 修正後の人口 |
|---|---|---|
| 00101 | 架空地区A | 1200 |
| 00102 | 架空地区B | 850 |
| 00103 | 架空地区C | 2100 |
| 00104 | 架空地区D | 460 |
zones.geojsonをQGISに読み込みます。CSVはまずpopulation_bad.csvを使って中身を確認し、正しく結合する段階ではpopulation_clean.csvを使います。両方を同時に読み込む場合は、どちらを結合対象にしているか間違えないようにしてください。
2.「同じように見える」結合キーを点検する

修正前のCSVでは、00101が101になり、00102には前後に空白が付いています。さらに00103が重複し、00104がありません。これらはそれぞれ別の問題です。すべてを「文字列にすれば直る」と考えず、元の資料と照合して原因を切り分けましょう。
結合するCSVのキーが重複していると、レイヤープロパティの結合では最初に取得された一致行だけが使われることがあります。複数年のデータなら、対象年で絞る、地域と年の組み合わせでキーを作るなど、目的に合った整理が必要です。人口を合計してよいかどうかもデータの意味によって異なります。
3.地域コードを文字列として読み込む
コードは計算する数値ではなく、地区を区別する識別子として扱います。例えば00101を整数で読み込むと先頭の0を保持できません。Excelで表示形式だけを5桁にしても、CSVに保存された値が101のままという場合があるため、保存後のファイルそのものを確認してください。
今回の教材では、CSVと同じフォルダに同名のcsvtを置いて型を指定しています。population_clean.csvtの内容は次の1行です。列の順番はCSVのcode、populationと対応しています。
"String","Integer"
QGISのブラウザパネルからpopulation_clean.csvを読み込み、属性テーブルやプロパティでcodeが文字列として扱われているか確認します。csvtを使う読み込み方法と「CSVテキスト」ダイアログの型検出設定は別なので、別の方法で読み込んだ場合も結果の型を必ず確認してください。
既存のキーを整えるなら、フィールド計算機で新しい文字列フィールドを作り、例えばtrim(to_string(“code”))で前後の空白を除けます。5桁と定義されたコードの先頭0だけが欠落した場合は、次の式が使えます。
lpad(trim(to_string("code")), 5, '0')
ただし、元のコードが不明な場合に桁数だけで補ってはいけません。全角数字、内部の空白、異なるコード体系はこの式では解決しません。元データを残し、別のフィールドで修正する形にしておくと、どこを直したか確認できます。
4.画面を見ながらCSVを結合する
操作1:地図側のzonesから設定を開く
レイヤーパネルでzones(地図側)を右クリックし、「プロパティ」→「テーブル結合」を開きます。左下の+が結合の追加です。CSV側から開くと結合の向きが逆になるので、地図側を選んでいるか確認してください。
操作2:CSV側と地図側のcodeを対応させる
+を押すと次のダイアログが開きます。「結合するレイヤ」にpopulation_clean、「結合基準の属性」にCSV側のcode、「ターゲット属性」に地図側のcodeを選び、OKを押します。

操作3:追加された結合設定を確認して確定する
結合を追加したら、一覧の左の三角を開きます。下の画面のようにpopulation_cleanと両側のcodeが表示されれば、設定が追加されています。最後にプロパティ画面でもOKを押して確定します。

結合後の列名にはpopulation_clean_のような接頭辞が付くことがあります。次は属性テーブルで、実際に人口値が入ったかを確認します。
5.NULLの件数と、人口の型を確認する
レイヤーパネルでzonesを選び、F6キー(または右クリック→「属性テーブルを開く」)で属性テーブルを開き、4地区の人口が1200、850、2100、460になっているか確認します。追加された人口列がpopulation_clean_populationなら、式による選択で次を指定すると未結合の行を探せます。実際の列名に合わせて置き換えてください。

"population_clean_population" IS NULL
今回の修正後データでは、人口の欠損がなく4地区すべてに一致する想定なので、選択件数は0になるはずです。実データでは、元から欠損している人口と、結合が失敗したNULLは区別する必要があります。存在確認用のフラグ列をCSVに追加すると判別しやすくなります。
結合には成功しても、色分けの値として人口を選べない場合は、人口が文字列になっていないか確認します。修正前の「1,200」のような表記を数値にする場合は、元の意味を確認したうえでto_int(replace(“population”, ‘,’, ”))のように区切り文字を取り除きます。「不明」や秘匿記号を勝手に0へ置き換えるのは避けましょう。
6.結果を保存し、CSVとのつながりも整理する
プロパティによる結合は、CSVを参照する設定です。プロジェクトだけ保存しても、CSVを移動すると参照できなくなる場合があります。結合した値を持つ独立した地物として残すには、地図レイヤーを右クリックし「エクスポート」→「新規ファイルに地物を保存」でGeoPackageなどに出力します。出力後に人口列と件数を再確認してください。
| 症状 | 最初に確認する点 |
|---|---|
| ほぼ全部NULL | 結合先・キー列・コード体系・型 |
| 一部だけNULL | 先頭0、前後空白、未掲載の地区、欠損 |
| 意図しない値が付く | CSV側のキー重複、対象年、集計単位 |
| 色分けに使えない | 人口列が数値型か、区切り記号や欠損記号がないか |
まとめ・参考資料
CSVの結合では、見た目だけでなく「値」「型」「一意性」を確認することが大切です。正しく結合できたら、属性データの色分けに進んでみてください。地図の位置が合わない場合はCRSの確認方法を先にチェックしましょう。
参考:QGIS公式:レイヤー間の結合、QGIS公式:CSVとCSVTによる型指定。比較表・サンプルは本記事用に作成しました。
入門の学習順と公開済みの実習はQGISの教科書で確認できます。次の実習は人口・人口密度の色分けです。


コメント