最終更新日:2021/8/5

【説明すること】

1. 列の追加

ここでは自分で用意した「1列」を新しい列として追加(挿入)する方法を説明します。
Excelで言うと、2つのファイルがあり、一方から一列をコピーして、他方に張り付けるイメージです。

1.1 列の最後にlistから追加する: df['New']=li

既に用意したlistを既存のdfに列(カラム)として追加する場合です。最後列に追加されます。

※list → dfの列(カラム)

追加するカラム名(列名)を’New’とした場合
df['New'] = li
と書きます。

例として、ここでは以下のcsvファイルを読み込んで話を進めます。

a004_001a.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ファイルを読み込みます。

a004_001b.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という事です。