Pythonでデータ処理を行っていると、既存の2次元配列(リストのリスト)に対して、「新しいデータ行を追加したい」「既存のデータに新しい項目の列を足したい」という場面が頻繁に訪れます。
ここを混同すると、意図しないエラーやパフォーマンスの低下を招く原因となります。
この記事では、Pythonの標準リストとNumPy配列のそれぞれについて、行(縦方向)や列(横方向)を追加する具体的なコードとその仕組みを徹底解説します。
初心者の方が迷いやすい「空の配列から動的に作る方法」も紹介しますので、ぜひ参考にしてください。
![]() 執筆者:マヒロ |
|
Pythonの標準リストで2次元配列に行(データセット)を追加する
Pythonの標準機能であるリスト型(list)を使って2次元配列を扱う場合、行の追加は非常に直感的で簡単です。
リストのメソッドである append() や extend() を使うことで、Excelの表に行を足していくような操作が可能です。
appendメソッドで末尾に1行追加する
最も基本となるのが append() メソッドです。
これはリストの末尾に、新しい要素(ここでは1行分のリスト)をそのまま追加します。
# 2次元配列(リストのリスト)の初期化
matrix = [
[1, 2, 3],
[4, 5, 6]
]
# 追加したい新しい行
new_row = [7, 8, 9]
# appendを使って末尾に追加
matrix.append(new_row)
print(matrix)
実行結果
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matrix.append(new_row) を実行することで、元のリスト matrix の一番後ろに [7, 8, 9] というリストが1つの要素として追加されます。
これにより、2行3列だった配列が、3行3列の配列になりました。処理速度も速く、最も頻繁に使われる方法です。
extendメソッドや+=演算子で複数の行を結合する
1行だけでなく、複数の行をまとめて追加したい場合は extend() メソッドか += 演算子を使います。
append でリストを追加すると「リストの中にリストが入る」形になりますが、extend は「リストの中身を展開して追加」します。
matrix = [
[1, 2],
[3, 4]
]
# 追加したい複数の行
additional_rows = [
[5, 6],
[7, 8]
]
# extendを使って結合
matrix.extend(additional_rows)
# matrix += additional_rows # これでも同じ結果になります
print(matrix)
実行結果
[[1, 2], [3, 4], [5, 6], [7, 8]]
extend() は引数に渡されたリストの要素を、元のリストの末尾に順番に追加します。
ここでは additional_rows が2次元配列(リストのリスト)なので、その要素である [5, 6] と [7, 8] がそれぞれ matrix に追加され、結果として行が増える形になります。
insertメソッドで好きな位置に行を挿入する
末尾ではなく、先頭や途中に割り込ませる形でデータを追加したい場合は insert() メソッドを使用します。
matrix = [
[1, 2],
[5, 6]
]
new_row = [3, 4]
# インデックス1(2番目)の位置に挿入
matrix.insert(1, new_row)
print(matrix)
実行結果
[[1, 2], [3, 4], [5, 6]]
insert(挿入したいインデックス, 要素) の形式で指定します。
上記の例ではインデックス 1 を指定しているため、元々インデックス0にあった [1, 2] の後ろ、インデックス1にあった [5, 6] の前に新しい行が挿入されました。
Pythonの標準リストで「列」を追加する方法
行の追加に比べて、リスト型での「列」の追加(各行に新しい要素を一つずつ足す処理)は少し工夫が必要です。
リストには「列を追加する」という直接的なメソッドが存在しないため、ループ処理などを使って各行を更新する必要があります。
forループを使って各行に要素を追加する
最も基本的で分かりやすいのが、for 文を使って各行にアクセスし、append() で要素を足していく方法です。
matrix = [
[1, 2],
[3, 4],
[5, 6]
]
# 追加したい列のデータ
new_column = [10, 20, 30]
# 行数と追加するデータの数が合っているか確認するのが安全
if len(matrix) == len(new_column):
for i in range(len(matrix)):
# i番目の行に、i番目のデータを追加
matrix[i].append(new_column[i])
print(matrix)
実行結果
[[1, 2, 10], [3, 4, 20], [5, 6, 30]]
for i in range(len(matrix)): で行の数だけループを回しています。
matrix[i] でi番目の行(リスト)を取得し、そこに append() で新しい列のデータ new_column[i] を追加しています。
これにより、縦方向にデータが結合されたように見えます。
zip関数を使ったスマートな列追加テクニック
リスト内包表記と zip() 関数を組み合わせると、よりPythonらしい簡潔な書き方で列を追加できます。
matrix = [
[1, 2],
[3, 4]
]
new_column = [9, 9]
# zipで既存の行と新しい値をペアにして、新しいリストを作成
# xは元の行(例: [1, 2])、yは追加する値(例: 9)
new_matrix = [x + [y] for x, y in zip(matrix, new_column)]
print(new_matrix)
実行結果
[[1, 2, 9], [3, 4, 9]]
zip(matrix, new_column) は、元の行 [1, 2] と追加データ 9 をセットにして取り出します。
リスト内包表記の中で x + [y] を行うことで、[1, 2] + [9] すなわち [1, 2, 9] という新しい行を作成し、それを集めて新しい2次元配列を構築しています。
注意点として、この操作は元のリスト matrix を変更する(破壊的操作)のではなく、新しいリスト new_matrix を生成します。
メモリ使用量や変数の扱いに気を付けてください。
空の2次元配列を定義して動的に要素を追加していく手順
データ処理の現場では、最初は空の状態からスタートし、計算結果を順次追加していくパターンがよくあります。
ここでは空の配列を定義し、データを蓄積していく実装例を紹介します。
空リストから始めてデータを蓄積する
# 空のリストを定義
data_matrix = []
# 何かの処理ループ(例:0から2まで)
for i in range(3):
# 計算などで新しい行データを作成
row = [i, i * 10, i * 100]
# 2次元配列に追加
data_matrix.append(row)
print(data_matrix)
実行結果
[[0, 0, 0], [1, 10, 100], [2, 20, 200]]
最初に data_matrix = [] で空のリストを用意します。
ループの中で row という1行分のリストを作成し、それを data_matrix.append(row) で積み上げていきます。
CSVファイルの読み込みや、ログデータの解析などで頻繁に使用されるパターンです。
NumPy配列(ndarray)で行や列を追加する方法
数値計算ライブラリ「NumPy」を使う場合、リストとは異なる専用の関数を使用します。
NumPy配列は計算速度が速い反面、「配列のサイズ変更」は新しい配列を生成する処理になるため、頻繁な追加はパフォーマンスを低下させる可能性がある点に注意が必要です。
np.appendで追加する(axisの指定が重要)
np.append() 関数を使うと、配列に要素を追加できます。
重要なのは axis(軸)の指定です。
import numpy as np
# 2行3列のNumPy配列
arr = np.array([
[1, 2, 3],
[4, 5, 6]
])
# 追加する行(2次元配列として定義する点に注意)
new_row = np.array([[7, 8, 9]])
# axis=0 は「行(縦方向)」への追加
result = np.append(arr, new_row, axis=0)
print(result)
実行結果
[[1 2 3]
[4 5 6]
[7 8 9]]
np.append(元の配列, 追加する配列, axis=0) で行を追加します。
注意点として、追加する new_row も [[...]] のように2次元配列の形状をしている必要があります。
axis=0 を指定しないと、すべての要素が1列に平坦化されてしまうので気をつけましょう。
【重要】NumPy配列をforループで拡張してはいけない
NumPyの np.append は、実行するたびに新しいメモリ領域の確保と全データのコピーを行います。
そのため、forループの中で arr = np.append(arr, new_row) のように繰り返し実行すると、データ量が増えるにつれて処理時間が指数関数的に遅くなります(計算量が O(N^2) になります)。
データを順次追加したい場合は、以下のいずれかの方法が推奨されます。
- Pythonの標準リストで
appendして、最後にnp.array()でNumPy配列に変換する(最も手軽で高速) - 予め
np.zerosなどで十分なサイズの配列を確保し、インデックスで値を代入する(サイズが分かっている場合)
np.vstackとnp.hstackで行・列を結合する
より直感的に行や列を追加(結合)したい場合は、vstack(垂直結合)と hstack(水平結合)が便利です。
import numpy as np
arr = np.array([
[1, 2],
[3, 4]
])
# 行を追加(Vertical Stack:垂直方向に積む)
row_to_add = np.array([5, 6])
result_v = np.vstack((arr, row_to_add))
print("行追加:\n", result_v)
# 列を追加(Horizontal Stack:水平方向に積む)
# 列ベクトルとして形状を合わせる必要がある
col_to_add = np.array([
[10],
[20]
])
# 単なる [10, 20] だと形状不一致エラーになることがあるため、必要なら reshape などを検討する
# 今回は2次元配列としての整合性を保つため、最初から [[10], [20]] の形で定義するか
# col_to_add.reshape(-1, 1) とするのが安全です。
result_h = np.hstack((arr, col_to_add))
print("列追加:\n", result_h)
実行結果
行追加:
[[1 2]
[3 4]
[5 6]]
列追加:
[[ 1 2 10]
[ 3 4 20]]
コードの解説
np.vstack: 配列を縦に積み重ねます。行の追加に相当します。np.hstack: 配列を横に連結します。列の追加に相当します。ただし、追加する配列の「行数」が元の配列と一致している必要があります。また、列を追加する場合は、追加するデータも列ベクトル((N, 1)の形状)である必要があります。
np.insertでインデックスを指定して挿入する
リストの insert と同様に、NumPyでも np.insert で場所を指定して追加が可能です。
import numpy as np
arr = np.array([
[1, 2, 3],
[7, 8, 9]
])
# 1行目(インデックス1)の前に新しい行を挿入
# axis=0 は行方向
result = np.insert(arr, 1, [4, 5, 6], axis=0)
print(result)
実行結果
[[1 2 3]
[4 5 6]
[7 8 9]]
np.insert(配列, インデックス, 値, axis=軸) を使います。
axis=0 なら指定したインデックスの「行」として挿入され、axis=1 なら「列」として挿入されます。
特定の位置にデータを差し込みたい場合に非常に有効です。
Pythonのスキルを活かして年収を上げる方法
以上、Pythonで2次元配列に行・列を追加する方法について解説してきました。
なお、Pythonのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。
Pythonエンジニアの需要は非常に高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなPythonの案件を探しやすくなります。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。



