2歩戻ったら2.5歩進みたい

関東で働くweb developerのブログ

【Python】pandasのDataframe操作

どうもこんにちは。きゃにすたーです。

Pythonのデータ解析ライブラリであるpandasを使ったファイル操作で自分が使ったものをまとめました。雑多に使ったものをまとめたのでちょくちょく追記していきたい。 間違いなどあればご指摘ください。バージョンはPython 3.6.3です。

$ python -V
$ Python 3.6.3 :: Anaconda, Inc.

重複列の削除

.drop_duplicates(subset='カラム名')

df.drop_duplicates(subset='開始日') #日付が重複しているレコードは削除

指定したカラム(subset)において重複した値を持つレコードを削除する。

テーブルの結合

.merge(DataFrame, DataFrame, on= キーとするカラム名)

df1とdf2がkeysカラムをキーに持つ場合、

df3 = pd.merge(df1,df2,on='keys')

これで結合できる。結合の仕方は指定しなければ内部結合。

howにleftやright、outerを入れれば左側・右側・外部結合される。

欠損値を0埋め

.fillna(埋める値) column1の値が欠損したレコードを0で埋める場合、

data_bin['column1'] = data_bin['column1'].fillna(0) 

これで0埋めできる。

書いている時、以下のように書いてしまってちょっとハマった。

data_bin = data_bin['column1'].fillna(0) 

要するに列を指定して代入する方法が分からなかっただけなのだが、 こう書いてしまうと、欠損値を持つレコードの全カラムが0で埋まってしまう。

値ありのフィールドを1で埋める

df['column1'] = df['column1'].where(df1['column1'] == 0, 1)

ちょっとややこしいのだが、 .where(trueの時に元の値を残す条件,false時の値) で条件を指定して書き換えができる。

上の書き方をした時はcolumn1が欠損値を0で埋めている状態だったので、

0以外の値が入っているフィールドは全て1に書き換える、という感じ。

.where()で置換する時は新しいDataFrameを返すので、代入しないといけない。

カラム名書き換え

.rename(columns={リネーム前,リネーム後})

df1 = df1(columns={'column1':'column_renamed'}) 

なんということはない。

この書き方は列を指定しているが、

df1.columns = ['column1','column2']

こう書くと頭のカラムから書き換えられる。

カラム・レコード削除

レコードを削除する場合:.drop('インデックス')

カラムを削除する場合:.drop('カラム名',axis=1)

df1 = df1.drop('1') #インデックスが1のレコードを削除

df1 = df1.drop('date',axis=1) #date列を削除

axisはデフォルト値が0なので、何も入れなければインデックスを指定してレコードを削除する。 また、リスト形式で列名orインデックスを渡せば複数を一括で削除できる。

列名を指定して全レコード取得

df2 = df1[['column1','column2']]

ピンとこなくて15分ぐらいハマったもののなんということはない。

df[カラム名]なのをリストで一括指定しているだけ。

まとめ

とりあえず使ったものを雑多に並べてみた。 初めてコーディングについて書いたので不得手なところもあるがこれからも定期的に書いていきたい。