みなさんこんにちは、ZeroTerasu(@ZeroTerasu)です。
前回は、Pythonのデータ分析ライブラリ「Pandas」の第2回講座としてDataFrameの要素、行、列の取得方法および代入方法について解説致しました。
今回は、DataFrameの行・列の追加および削除について解説致します。
エクセルのような表計算ソフトにおいても、行・列の追加および削除は基本的な動作になると思いますが、PandasのDataFrameではどのように操作するのか解説致します。
今回も下記のDataFrameを使用致します。(今回は、indexに’名前’列を指定したDataFrameを使用します。)
DataFrameの列への追加
列の追加方法-1:インデックス参照 df[‘列名’] = 値(スカラー値, 配列, Series)
まずは最も簡単な方法であるインデックス参照による列の追加方法です。
・列名:df[]の[]に追加する列の”列名“を指定します。(列を追加後、この列名がカラム名としてDataFrameに反映されます。)
・値:追加列のデータをスカラー値や配列で代入します。
・上記で記述した”列名”が、対象のDataFrameのカラム名に存在しない場合、新規列としてDataFrameに追加されることになります。(既に、上述の”列名”がDataFrameのカラム名に存在する場合は値の上書きになります。)
# 例-1:値にスカラー値を代入
df['社会'] = 75
df
# 実行結果
# 国語 数学 英語 社会
# 名前
# 佐藤さん 65 70 85 75
# 鈴木さん 80 72 60 75
# 田中さん 90 80 55 75
# 例-2:値に配列(リスト)を代入
df['社会'] = [90,80,70]
df
# 実行結果
# 国語 数学 英語 社会
# 名前
# 佐藤さん 65 70 85 90
# 鈴木さん 80 72 60 80
# 田中さん 90 80 55 70
# 例-3:値にSeriesを代入
newCol = pd.Series([90, 80, 70], index=df.index, name='理科')
newCol
# 実行結果
# 名前
# 佐藤さん 90
# 鈴木さん 80
# 田中さん 70
# Name: 理科, dtype: int64
# DataFrameに上記で作成したSeries = newColを代入する
df['理科'] = newCol
df
# 実行結果
# 国語 数学 英語 理科
# 名前
# 佐藤さん 65 70 85 90
# 鈴木さん 80 72 60 80
# 田中さん 90 80 55 70
# 例-3'(参考):値にSeriesを代入 * SeriesのインデックスがDataFrameのインデックスと一致しない場合は、欠損地NaNが代入される。
newColr = pd.Series([70,80,90], index=['佐藤さん','鈴木さん','山本さん'], name='理科')
df['理科'] = newColr
df
# 実行結果
# 国語 数学 英語 理科
# 名前
# 佐藤さん 65 70 85 70.0
# 鈴木さん 80 72 60 80.0
# 田中さん 90 80 55 NaN <= 田中さんの値がSeriesに存在しないためNaNが代入されている。
列の追加方法-2:assign()メソッド df.assign(列名=値)
・assign()メソッドでは、引数に「列名=値」を指定することで新たな列をDataFrameに追加することができます。
・assign()メソッドでは、新たなDataFrameオブジェクトが返されます。
・assign()メソッドで追加された列は、元のDataFrameオブジェクトには反映されません。
・assign()メソッドでは、一度に複数の列を追加することが可能です。
・値:追加列のデータをスカラー値や配列で代入します。(インデックス参照と同様です。)
df.assign(体育=70)
# 実行結果
# 国語 数学 英語 体育
# 名前
# 佐藤さん 65 70 85 70
# 鈴木さん 80 72 60 70
# 田中さん 90 80 55 70
df.assign(体育=70,
家庭科=[80,90,60],
美術=pd.Series([70,60,50],index=['鈴木さん','田中さん','山本さん'],name='美術'),
音楽=np.array([80, 60, 50]))
# 実行結果
# 国語 数学 英語 体育 家庭科 美術 音楽
# 名前
# 佐藤さん 65 70 85 70 80 NaN 80
# 鈴木さん 80 72 60 70 90 70.0 60
# 田中さん 90 80 55 70 60 60.0 50
列の追加方法-3:insert()メソッド df.insert(挿入位置, 列名, 値)
・insert()メソッドでは、挿入位置(整数)、列名(挿入列の列名)、値(スカラー値、配列、Series)の3つの引数を指定することで列を追加することが出来る。
・insert()メソッドでは、任意の位置に列を追加することが可能。(インデックス参照およびassign()メソッドでは、一番右側に挿入される。)
・insert()メソッドでは、元のDataFrameオブジェクトが更新される。
・挿入される側のDataFrameの各列の位置は、「df.columns.get_loc(列名)」で確認可能。
・DataFrameの一番右側に挿入する場合は、「挿入位置=len(df.columns)」を指定すれば良い。
df.insert(1,'音楽',70)
df
# 実行結果
# 国語 音楽 数学 英語
# 名前
# 佐藤さん 65 70 70 85
# 鈴木さん 80 70 72 60
# 田中さん 90 70 80 55
列の削除方法:drop()メソッド df.drop(列名, axis=1, inplace=True or False) or df.drop(df.columns[[列名]], axis=1, inplace=True or False)
・drop()メソッドでは、引数に「列名」と「axis=1」を指定することで任意の列を削除することが出来る。
・引数の「列名」をリスト形式[‘列名1’, ‘列名2’, …]で複数列指定することもできる。
・列番号で指定する場合は、DataFrameオブジェクトの「columns属性」で指定する。
・引数「inplace」を「True」に指定すると、元のDataFrameからも削除される。(inplace指定なしまたはinplace=Falseとすると、元のDataFrameは変化しない。)
df.drop('国語',axis=1,inplace=False)
# 実行結果
# 数学 英語
# 名前
# 佐藤さん 70 85
# 鈴木さん 72 60
# 田中さん 80 55
df.drop(['国語','英語'],axis=1,inplace=False)
# 実行結果
# 数学
# 名前
# 佐藤さん 70
# 鈴木さん 72
# 田中さん 80
df.drop(df.columns[[0,2]],axis=1,inplace=False)
# 実行結果
# 数学
# 名前
# 佐藤さん 70
# 鈴木さん 72
# 田中さん 80
df.drop(columns=df.columns[[0,1]])
# 実行結果
# 数学
# 名前
# 佐藤さん 70
# 鈴木さん 72
# 田中さん 80
DataFrameの行への追加
行の追加方法-1:loc[]メソッド df.loc[‘行名’] = 値(スカラー値, 配列, Series)
・loc[]メソッドの引数に’行名’を指定して列を追加できます。
・loc[]の引数に指定した’行名’がまだDataFrameに存在しない行名の場合、新規行として追加される。
・値:列数分の値を代入しなければエラーとなるケースがあったため、今回使用しているDataFrameの列数=3個の値を代入することにした。
assignList = []
for i in range(0,len(df.columns)):
assignList.append(60)
# assignList = [60, 60, 60] DataFrameの列数=3個の値を配列に格納して、新規行の値としてDataFrameに代入する。
df.loc['山田さん'] = assignList
df
# 実行結果
# 国語 数学 英語
# 名前
# 佐藤さん 65 70 85
# 鈴木さん 80 72 60
# 田中さん 90 80 55
# 山田さん 60 60 60
# Seriesによる代入
df.loc['山田さん'] = pd.Series([60, 70, 80],index=df.columns, name='山田さん')
df
# 実行結果
# 国語 数学 英語
# 名前
# 佐藤さん 65 70 85
# 鈴木さん 80 72 60
# 田中さん 90 80 55
# 山田さん 60 70 80
行の追加方法-2:append()メソッド df.append(DataFrame, Series, 辞書型, リスト)
・append()メソッドは、引数にDataFrame型、Series型、辞書型、リスト型を格納し、行を追加することが出来る。
・append()メソッドでは、元のDataFrame変更されない。
・辞書型を追加する際は、ignore_index=Trueとしなければエラーとなるが、ignore_indexを指定するとDataFrameのインデックスがリセットされてしまう。
# 例1:リスト型の例
df.append([10,20,30])
# 実行結果
# 国語 数学 英語 0
# 佐藤さん 65.0 70.0 85.0 NaN
# 鈴木さん 80.0 72.0 60.0 NaN
# 田中さん 90.0 80.0 55.0 NaN
# 0 NaN NaN NaN 10.0
# 1 NaN NaN NaN 20.0
# 2 NaN NaN NaN 30.0
# 例2:DataFrame代入の例(追加するDataFrame=add_dfを作成し、DataFrameに追加しています。)
add_df = pd.DataFrame({
'名前':['山田さん', '高橋さん', '木村さん'],
'国語':[75,85,95],
'数学':[75,85,95],
'英語':[75,85,95],
}).set_index('名前')
# add_df
# 国語 数学 英語
# 名前
# 山田さん 75 75 75
# 高橋さん 85 85 85
# 木村さん 95 95 95
df.append(add_df)
# 実行結果
# 国語 数学 英語
# 名前
# 佐藤さん 65 70 85
# 鈴木さん 80 72 60
# 田中さん 90 80 55
# 山田さん 75 75 75
# 高橋さん 85 85 85
# 木村さん 95 95 95
例3:辞書型の行追加(新規行として「add_dict」という辞書型データを用意して、DataFrameに追加する。)
add_dict = {
'国語':60,
'数学':70,
'英語':80,
}
# add_dict = {'国語': 60, '数学': 70, '英語': 80}
df.append(add_dict,ignore_index=True)
# 実行結果 辞書型を追加する際は、ignore_index=Trueとしなければエラーとなるが、ignore_indexを指定するとDataFrameのインデックスがリセットされてしまう。
# 国語 数学 英語
# 0 65 70 85
# 1 80 72 60
# 2 90 80 55
# 3 60 70 80
行の削除方法:df.drop()メソッド
・行の削除にも、列の削除同様にdrop()メソッドを使用する。
・行名 または 行番号を指定する。
行名で削除:df.drop(行名, axis=0, inplace=True or False) or df.drop(index=[行名], axis=0, inplace=True or False)
・drop()メソッドの引数に、行名指定 または indexで行名指定する。
・引数axisは、デフォルトで「0」のため省略可。
・引数inplace=Trueで元のDataFrameも変更可。
df.drop('佐藤さん')
# 実行結果
# 国語 数学 英語
# 名前
# 鈴木さん 80 72 60
# 田中さん 90 80 55
df.drop(index=['佐藤さん','田中さん'])
# 実行結果
# 国語 数学 英語
# 名前
# 鈴木さん 80 72 60
行インデックス指定で削除:df.drop(df.index[[インデックス番号]] axis=0, inplace=True or False)
・インデックスが指定されていないDataFrameの場合、行名指定での削除が出来ない。
・インデックスが指定されていないDataFrameの場合、drop()メソッドの引数に、DataFrameのインデックスを渡すことで削除する。
・行番号を指定した行の削除も同じ方法を適用する。
df.drop(df.index[[0,2]])
# 実行結果
# 国語 数学 英語
# 名前
# 鈴木さん 80 72 60
複数行・複数列を削除:df.drop(index=[‘行名’], columns=[‘列名’])
・drop()メソッドの引数に、indexとcolumnsの両方にそれぞれ’行名’および’列名’を渡すことで行と列を同時に削除することが出来る。
・引数inplace=Trueで元のDataFrameも変更可。
df.drop(index=['佐藤さん','田中さん'],columns=['国語'])
# 実行結果
# 数学 英語
# 名前
# 鈴木さん 72 60
コメント