概要
DataFrameの列の操作をまとめる。
以下、次のDataFrame
を使う。
|
import numpy as np import pandas as pd ary = np.arange(16).reshape(4, 4) df = pd.DataFrame(ary, columns=["one", "two", "three", "four"]) print(df) # one two three four # 0 0 1 2 3 # 1 4 5 6 7 # 2 8 9 10 11 # 3 12 13 14 15 |
列の参照
DataFrameで列名を直接指定
1つの列を指定
DataFrame
で直接列名を指定するとSeries
オブジェクトが得られ、リストやndarray
にも変換できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
col = df["two"] print(col) # 0 1 # 1 5 # 2 9 # 3 13 # Name: two, dtype: int32 print(type(col)) # <class 'pandas.core.series.Series'> print(list(col)) print(np.array(col)) # [1, 5, 9, 13] # [ 1 5 9 13] |
ファンシー・インデックスによる複数列の指定
DataFrame
で直接列名を指定する際に列名のリストを渡すと、その要素の列が並んだDataFrame
が返される。
|
cols = df[["two", "four"]] print(cols) # two four # 0 1 3 # 1 5 7 # 2 9 11 # 3 13 15 print(type(cols)) # <class 'pandas.core.frame.DataFrame'> |
loc
による列の指定
1つの列の指定
loc
で全行のスライス':'
とすることで、列名を指定して列を取り出すことができる。結果はSeries
オブジェクト。
|
print(df.loc[:, "two"]) # 0 1 # 1 5 # 2 9 # 3 13 Name: two, dtype: int32 |
スライスによる連続した列の指定
列名にもスライスを使って連続した列を参照することができ、複数列の場合はDataFrame
が返される。
|
print(df.loc[:, "two":"three"]) # two three # 0 1 2 # 1 5 6 # 2 9 10 # 3 13 14 |
ファンシーインデックスによる複数列の指定
loc
でもファンシーインデックスを使うことができて、個別の列を組み合わせたDataFrame
を得ることができる。
|
print(df.loc[:, ["two", "four"]]) # two four # 0 1 3 # 1 5 7 # 2 9 11 # 3 13 15 |
列の追加
DataFrame
で直接列名を指定して追加
DataFrame
に新たな列名を指定して末尾に列を追加。列にarray_likeではなく数値を指定すると、列の全ての要素が同じ数値で埋められる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
df_update = df.copy() df_update["five"] = [50, 51, 52, 53] print(df_update) # one two three four five # 0 0 1 2 3 50 # 1 4 5 6 7 51 # 2 8 9 10 11 52 # 3 12 13 14 15 53 df_update["six"] = 60 print(df_update) # one two three four five six # 0 0 1 2 3 50 60 # 1 4 5 6 7 51 60 # 2 8 9 10 11 52 60 # 3 12 13 14 15 53 60 |
loc
でスライス指定して追加
全行をスライス指定、新たな行名を指定して末尾に列を追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
df_update = df.copy() df_update.loc[:, "five"] = [50, 51, 52, 53] print(df_update) # one two three four five # 0 0 1 2 3 50 # 1 4 5 6 7 51 # 2 8 9 10 11 52 # 3 12 13 14 15 53 df_update.loc[:, "six"] = 60 print(df_update) # one two three four five six # 0 0 1 2 3 50 60 # 1 4 5 6 7 51 60 # 2 8 9 10 11 52 60 # 3 12 13 14 15 53 60 |
assign
メソッドによる追加
assign
メソッドで末尾に追加する場合、列名は文字列("列名"
)ではなく、直接「列名=列
」で指定する。assign
メソッドは元のオブジェクトは変更せず、新たなDataFrame
を生成して返す。
|
print(df.assign(five=[50, 51, 52, 53])) # one two three four five # 0 0 1 2 3 50 # 1 4 5 6 7 51 # 2 8 9 10 11 52 # 3 12 13 14 15 53 print(df.assign(five=50)) # one two three four five # 0 0 1 2 3 50 # 1 4 5 6 7 50 # 2 8 9 10 11 50 # 3 12 13 14 15 50 |
insert
メソッドによる途中への追加
insert
メソッドは(挿入する列位置、"列名"、挿入する列)
で挿入する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
df_update = df.copy() df_update.insert(2, "two_half", [25, 26, 27, 28]) print(df_update) # one two two_half three four # 0 0 1 25 2 3 # 1 4 5 26 6 7 # 2 8 9 27 10 11 # 3 12 13 28 14 15 df_update.insert(4, "three_half", 30) print(df_update) # one two two_half three three_half four # 0 0 1 25 2 30 3 # 1 4 5 26 6 30 7 # 2 8 9 27 10 30 11 # 3 12 13 28 14 30 15 |
列の更新
DataFrame
で列名を直接指定
1つの列を指定
DataFrame
で列名を直接指定して、その列に新たな列を代入する。代入する列は縦ベクトルでなくてもよく、1次元のリストや配列でよい。
|
df_update = df.copy() df_update["two"] = [10, 50, 90, 130] print(df_update) # one two three four # 0 0 10 2 3 # 1 4 50 6 7 # 2 8 90 10 11 # 3 12 130 14 15 |
ファンシーインデックスによる複数列の指定
ファンシーインデックスで複数列をリストで指定し、その列数と同じ列数のデータを与えて更新する。
|
df_update = df.copy() df_update[["one", "three"]] = [ [ 0, 20], [ 40, 60], [ 80, 100], [120, 140] ] print(df_update) # one two three four # 0 0 1 20 3 # 1 40 5 60 7 # 2 80 9 100 11 # 3 120 13 140 15 |
loc
による列名・スライスの指定
1つの列の指定
loc
で全行のスライスと1つの列名を指定して列を更新。
|
df_update = df.copy() df_update.loc[:, "four"] = [30, 70, 110, 150] print(df_update) # one two three four # 0 0 1 2 30 # 1 4 5 6 70 # 2 8 9 10 110 # 3 12 13 14 150 |
スライスによる連続した列の指定
スライスで連続した列を指定して一括して更新することができる。その場合、指定されたDataFrameの形状に合った次元・次数のデータを与える必要がある。
|
df_update.loc[:, "one":"three"] = [ [ 0, 10, 20], [ 40, 50, 60], [ 80, 90, 100], [120, 130, 140] ] print(df_update) # one two three four # 0 0 10 20 30 # 1 40 50 60 70 # 2 80 90 100 110 # 3 120 130 140 150 |
ファンシーインデックスによる複数列の指定
ファンシーインデックスも使うことができて、この場合も形状に合った次元・次数のデータを与える必要がある。
|
df_update.loc[:, ["two", "four"]] = [ [ 1, 3], [ 5, 7], [ 9, 11], [13, 15], ] print(df_update) # one two three four # 0 0 1 20 3 # 1 40 5 60 7 # 2 80 9 100 11 # 3 120 13 140 15 |
列の削除
例題のデータ
以下の2つのデータを使って、列番号指定の場合と列名指定の場合を確認する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
import numpy as np import pandas as pd array = np.arange(25).reshape(-1, 5) df_numbered = pd.DataFrame(array) df_named = pd.DataFrame(array, columns=["zero", "one", "two", "three", "four"]) print(df_numbered) # 0 1 2 3 4 # 0 0 1 2 3 4 # 1 5 6 7 8 9 # 2 10 11 12 13 14 # 3 15 16 17 18 19 # 4 20 21 22 23 24 print(df_named) # zero one two three four # 0 0 1 2 3 4 # 1 5 6 7 8 9 # 2 10 11 12 13 14 # 3 15 16 17 18 19 # 4 20 21 22 23 24 |
1列の削除
drop()
メソッドの引数に削除する列の列番号とaxis=1
を指定して削除(axis
指定の方向に注意)。
第1引数の列指定はlabels=1
、labels="one"
のように指定してもよい。
|
print(df_numbered.drop(1, axis=1)) # 0 2 3 4 # 0 0 2 3 4 # 1 5 7 8 9 # 2 10 12 13 14 # 3 15 17 18 19 # 4 20 22 23 24 print(df_named.drop("one",axis=1)) # zero two three four # 0 0 2 3 4 # 1 5 7 8 9 # 2 10 12 13 14 # 3 15 17 18 19 # 4 20 22 23 24 |
複数列の削除
複数列を削除する場合はリストで指定。
|
print(df_numbered.drop([1, 3], axis=1)) # 0 2 4 # 0 0 2 4 # 1 5 7 9 # 2 10 12 14 # 3 15 17 19 # 4 20 22 24 print(df_named.drop(["one", "three"], axis=1)) # zero two four # 0 0 2 4 # 1 5 7 9 # 2 10 12 14 # 3 15 17 19 # 4 20 22 24 |
連続した列の削除
連続した列を削除する場合はリストの内包表記で。
|
print(df.drop([x for x in range(1, 4)], axis=1)) # 0 4 # 0 0 4 # 1 5 9 # 2 10 14 # 3 15 19 # 4 20 24 |
文字列の列名の場合は、泥臭いが以下の方法か。
|
print(df_named.drop(df_named.loc[:, "one":"three"].columns, axis=1)) # zero four # 0 0 4 # 1 5 9 # 2 10 14 # 3 15 19 # 4 20 24\ |