最終更新日:2021/8/5
【説明すること】
- 1. 列の追加
- 1.1 列の最後にlistから追加する:
df['New']=li
- 1.2 列の最後に全て同じ値の列を追加する:
df['new']=1
- 1.3 任意の場所に列を追加する:
df.insert(n, 'NewClm', value)
- 1.4 列をコピーする
- 1.5 列の最後にli, se, dfから列を追加する:
df.assign()
- 1.1 列の最後にlistから追加する:
- 2. 列の削除
- 2.1 列名で1列を削除:
df.drop(columns='clm1')
- 2.2 列名で複数列を削除:
df.drop(columns=['clm1','clm2'])
- 2.3 列番号で複数列を削除:
df.drop(columns = df.columns[[0,1]])
- 2.4 連続した列番号を指定して削除:
df.drop(columns = df.columns[list(range(n)])
- 2.1 列名で1列を削除:
1. 列の追加
ここでは自分で用意した「1列」を新しい列として追加(挿入)する方法を説明します。
Excelで言うと、2つのファイルがあり、一方から一列をコピーして、他方に張り付けるイメージです。
1.1 列の最後にlistから追加する: df['New']=li
既に用意したlistを既存のdfに列(カラム)として追加する場合です。最後列に追加されます。
※list → dfの列(カラム)
追加するカラム名(列名)を’New’とした場合df['New'] = li
と書きます。
例として、ここでは以下のcsvファイルを読み込んで話を進めます。
以下が文字列のlist(li1)と数値のlist(li2)を追加する場合の例です。
注意:listの長さ(要素の数:len(li1)でわかる)とdfの行数が一致しないとエラーになります。
例えば、listの長さがlen(li1)=4, dfの行数がlen(df)=5の場合、エラーとなります。
1.2 列の最後に全て同じ値の列を追加する: df['new']=1
全て1や全て0の列を追加したい場合です。
小数でも構いません。例えば、小数0.01を列の値にする場合、df['new'] = 0.01
と書きます。ただし、最後列に追加されます。
文字列でも同じです。文字列は「”」または「””」で囲む事を忘れないでください。
1.3 任意の場所に列を追加する: df.insert(n, 'NewClm', value)
任意の場所に列(カラム)を追加したい場合です。
引数のvalueはli, seです。valueをdfから指定したい場合、カラム名を指定すれば可能です。但し、それは結局seという事になります。これは
df.insert(カラム番号, '新しいカラム名', 追加する値)
と書きます。
例:df1.insert(0, 'NewClm', li1)
カラム番号は0始まりです。例えば、先頭であれば0と指定し、2列目であれば1と指定します。
【ポイント】
- 用意した「追加する値」の形式はlist(li), series(se), dataframe(df)のどれでも可能ですが、実質的にはli, seのみが可能です。
dfは1列を抜き出す必要があるので、それは実際にはseです。 - 元のdfも書き換えられます(上書きされる)。
以下でli, se, dfのそれぞれの例を挙げます。
(a) li → df
(b) se → df
(c) df → df
dfから1列を抜き出し、それを.insert()します。この1列は実際にはseです。
1.4 列をコピーする
列をコピーする場合、前述の「1.3(c)df →df」で可能です。
これはつまり、dfから1列を指定してseとして抜き出し、そのseをdfの列に追加する、ということです。
以下は前出のコードと同じです。
1.5 列の最後にli, se, dfから列を追加する: df.assign()
最後列に追加するならば、df.assign()
を使って、df2 = df1.assign(clm1 = value )
(valueはli,se,dfの何れか)
でも可能です。.assign()の場合は、元のdfが上書きされないので、受ける為の新しいdfが必要です。(例えば、上の場合df2のことです。)
新しい列名(カラム名)に「”」または「””」は「不要」です。
liの場合
seの場合
dfの場合
同じ値を入れる場合
2. 列の削除
以下のcsvファイルを読み込みます。
以下ではpandasがバージョン0.21.0以降を前提としています。エラーが出る場合は、バージョンが低い可能性があるので、pandasのバージョンを上げてください。
2.1 列名で1列を削除: df.drop(columns = 'clm1')
df.drop(columns='clm1')
で可能です。ただし、元のdfは書き換えられないので、受け皿のdfを書きます。
元のdfを書き換えたい場合はオプションでinplace=True
を指定すれば可能です。
2.2 列名で複数列を削除: df.drop(columns = ['clm1','clm2'])
df.drop(columns = ['clm1', 'clm2'])
です。
li = [‘clm1’, ‘clm2’]のようにlistを用意して、columns = liと指定することもできます。
元のdfを書き換えたい場合はオプションでinplace = True
を指定します。
2.3 列番号で複数列を削除: df.drop(columns = df.columns[[0,1]])
(1) df.drop(columns = df.columns[[0,1]])
または
(2) df.drop(df.columns[[0, 1]], axis=1)
です。
ただし、今後の事を考えると(1)の方がいいでしょう。
どちらも、元のdfを上書きする、inplace=True
も指定可能です。
列名(カラム名)と同様に列番号は li = [0, 1]のようにlistで用意して、columns = li
と指定することもできます。
2.4 連続した列番号を指定して削除: df.drop(columns = df.columns[list(range(n)])
連続した列番号をまとめて削除したい時に、列番号をlistで[]に書くのは面倒です。
そんな時はcolumns = list(range(n))
とrange()を使って書くと楽です。
注意点:columns = range(n)では不十分で、columns = list(range(n))と、必ずlistで指定します。
[1,3,5]のように差が2のlistを作成したい場合は、list(range(1,6,2))とすれば可能です。
range(a,b,n)とは、aから(b-1)までで、その差がnの数列という意味です。range(1,6,2)ならば、1から5(=6-1)までで、その差が2という事です。