Python・pandasで前処理するときの色々小技まとめ

Python
LINEで送る
Pocket

こんにちは。
Pythonのpandasでデータを前処理することが最近多いのですが、そもそも本職がデータサイエンティストでもなく、しょっちゅうコードに触れていません(触れておけって感じですが)。すると、毎回のように同じところを調べて解決するのですが、初めからまとめておけば少しは楽になると思ったのでまとめます。

ちなみにこの内容は随時更新していく予定です。

Windowsで作ったcsvファイルの読み込み(Shift_JIS)

Windowsでcsvファイルを作成すると文字コードがShift_JISになっていて、普通にpd.read_csvで読み込もうとするとうまく読み込めません。その場合は引数にencoding="cp932"を指定することで読み込めます。

# Shift_JISのcsvデータ読み込み
df = pd.read_csv("TEST.csv",encoding="cp932")

参考
pandasにexcel出力のcsvを読ませる時に注意する点

データ読み込み時のヘッダ設定

csvデータの読み込みは引数を設定しなければ、1行目がヘッダとして読み込まれます。ヘッダがないcsvデータの場合は引数でheader=Noneを指定し、カラム名はnames=[]で指定をします。カラム名の指定がない場合は自動的に連番が割り当てられます。

# ヘッダなしcsvを読み込み、列名をa,b,cに指定
df = read_csv("TEST.csv", header=None, names=['a', 'b', 'c'])

参考
read_csv でヘッダあり・なしCSVの読み込み

列全体を全角から半角に変換したり、ひらがなからカタカナに変換したり

pythonで日本語の文字種変換はjaconvライブラリを使うのがとても便利みたいです。とても便利に使わせていただいいているのですが、データフレームなどでまとめて変換する時には一手間必要ですので、関数を作成しましょう。CSVデータをPythonでまとめて全角半角処理をめちゃくちゃ参考に(ほぼ引用)させてもらいました。

import jaconv

def henkan(column):
    list=  df[column].values.tolist()
    new_list = []

    for li in list:
        #このjaconvの処理で行いたい変換を指定(この場合はひらがなを半角カナに)
        li = jaconv.hira2hkata(li)
        new_list.append(li)

    df[column] = new_list

    return df[column]

#処理したいカラム名をリストに入れる。
columns = []

#forで回す。
for column in columns:
    henkan(column)
# jaconvの変換の主たるものは…
# ひらがな から カタカナ
jaconv.hira2kata('さんかく')
# => 'サンカク'

# ひらがな から 半角カタカナ
jaconv.hira2hkata('さんかく')
# => 'サンカク'

# カタカナ to ひらがな
jaconv.kata2hira('サンカク')
# => 'さんかく'

# 半角かな文字 to 全角かな文字
jaconv.h2z('サンカク')
# => 'サンカク'

参考
jaconv
CSVデータをPythonでまとめて全角半角処理

データフレーム標準の数字インデックスを消去、消去したインデックスを再設定

例えば普通にcsvファイルを読み込み、インデックスは数字が割り当てられます。

IDName
0001A
1002B
2003C
3004D

通常はこのままでも問題ないのですが、書き出すときに不要になったり、IDを先頭列にしないといけないことがあります。そんな時は、set_index関数を使います。

# 引数に指定した列がインデックスに割り当てられる
df = df.set_index('ID')
IDName
0A
1B
2C
3D

このようになります。

逆にインデックスを振り直す時にはreset_index関数を使います。sort_valuesなどを使ってインデックスがバラバラになった時にも有効です。

# インデックスを振り直す
df = df.reset_index()

参考
pandas.DataFrameの列をインデックス(行名)に割り当てるset_index
pandas.DataFrame, Seriesのインデックスを振り直すreset_index

氏名などの列を姓、名に分けて列を作成

氏名の列を姓と名に分けて列を作成したいときなどがあります。
例えば、

Name
A_a
B_b
C_c
D_d

というのを

NameLast_nameFirst_name
A_aAa
B_bBb
C_cCc
D_dDd

にしたい時には以下のコードで可能になります。

# '_'で分割した前半を'Last_name'に、後半を'First_name'に
df['Last_name']  = df['Name'].str.split(pat='_', expand=True)[0]
df['First_name'] = df['Name'].str.split(pat='_', expand=True)[1]

参考
pandas / DataFrame の中身の文字列を一括で分割して別の列として定義する

条件に応じて値を置換する

条件に応じて値を置換する方法はいくつかありますが、個人的にはlocを使う方法が簡単だと思います。

# gender列の値が'男'のものを1に置換する
df.loc[df['gender'] == '男' , 'gender'] = 1

# gender列の値が'男'のものを1に置換した'men'列を追加する
df.loc[df['gender'] == '男' , 'men'] = 1

参考
pandasで条件に応じて値を代入(where, mask)

複数条件の場合

複数条件の場合は&(AND)や|(OR)を使って条件を指定します。その場合、各条件をかっこで囲む必要があります。

# 'age'が18より小さいもの(18以上)かつ、'gender'が'女'の場合、'adlut'列を0に置換する
df.loc[~(df['age'] < 18) & (df['gender'] == '女'), 'adult'] = 0

# 'age'が18より小さい、もしくは'age'が65以上の場合、'age'列を1に置換する
df.loc[(df['age'] < 18) | (df['age'] >= 65), 'age'] = 1

参考
pandasで条件に応じて値を代入(where, mask)

特定の文字列を含むセルの値のみ置換

特定の文字列を含むという条件の場合はstr.contains()メソッドを使います。

# 'address'列に'府'を含む文字列がある場合、'prefectures'列を2に置換する
df.loc[df['address'].str.contains('府'), 'prefectures'] = 2

参考
pandasで特定の文字列を含む行を抽出(完全一致、部分一致)

日付の列を特定の書式に変換する(YYYY/MM/DD → YYYYMMDDなど)

日付の列を特定の書式に変換する場合には、to_datetime()関数を使って文字列をdatetime64型に変換した後に、dt.strftime()を使って変換します。dt.strftime()の引数は指定することで様々な形にできます。

# 'birthday'列をdatetime64型に変換
df['birthday'] = pd.to_datetime(df['birthday'])
# 'birthday'列を(YYYYMMDD)の形にする
df['birthday'] = df['birthday'].dt.strftime("%Y%m%d")

# 'birthday'列を(YYYY年MM月DD日)の形にする
df['birthday'] = df['birthday'].dt.strftime("%Y年%m月%d日")

# 'birthday'列を(Day of the week, Month DD, YYYY)の形にする
df['birthday'] = df['birthday'].dt.strftime("%A, %B %d, %Y")

参考
pandasで日付・時間の列を処理(文字列変換、年月日抽出など)

先頭が0から始まるX桁のIDなどに変換する

本当は0から始まるX桁のIDなのに、勝手に0が消えてしまう時があります(例:000123, 000124など)。そんな時はzfill関数を使って変換を行えます。zfill関数を使う時には文字列型に変換することが必要なので、astype関数などを使ってから行います。

# 0で埋めて6桁に変換
df['ID'].astype('str').str.zfill(6)

参考
Pandasで列データの前処理を行う小技集

カテゴリ変数のワンホットエンコーディング

性別や血液型などに代表されるそれぞれの値の間に意味がない変数をカテゴリ変数と言います。このカテゴリ変数を機械学習で使用するときに使える手法がワンホットエンコーディングです。ワンホットエンコーディングを使うと、

Gender
M
F
F
M
F

といったカテゴリ変数を、

FM
01
10
10
01
10

のような形にすることができ、機械学習で用いることができます。
ワンホットエンコーディングには、get_dummies関数を使用します。

# columnsに指定した列のみワンホットエンコーディングを実施
df = pd.get_dummies(df, columns=['Gender'])

参考
pandasでワンホットエンコーディング(ダミー変数)
One-Hotエンコーディング(ダミー変数)ならPandasのget_dummies()を使おう

LINEで送る
Pocket

コメント

タイトルとURLをコピーしました