pandas:【列,列名,index列】定義変更
前提
サンプルコード
列の追加
データ作成
import pandas as pd
df = pd.DataFrame({'id':['001','002','003'], 'value':[100,200,300]})
print(df)
print(df.shape)
id value 0 001 100 1 002 200 2 003 300 (3, 2)
- サイズ(3,2)のデータを作成
- 以降で列名id,valueの右に列を追加する
まずは作ってみる
df['key1'] = 'a'
print(df)
id value key1 0 001 100 a 1 002 200 a 2 003 300 a
- 「key1」列が追加になっている
- 'a’
- 全部の行が同じになる
行ごとにデータ設定
df['key2'] = [11,22,33]
print(df)
id value key1 key2 0 001 100 a 11 1 002 200 a 22 2 003 300 a 33
- 「key2」列が追加になっている
- [11,22,33]
- リストで設定
- 行数分データを設定する
参考
- 他にデータフレームをつなげる方法もある
- 以下の記事で説明
列名の変更
データ作成
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(8).reshape(2,4))
print(df)
print(df.shape)
0 1 2 3 0 0 1 2 3 1 4 5 6 7 (2, 4)
- サイズ(2,4)のデータを作成
- 次項で列名2(自動で振られたインデックス番号の列名)を変更する
データ作成
df.rename(columns={2:'aa'}, inplace=True)
print(df)
0 1 aa 3 0 0 1 2 3 1 4 5 6 7
- df.rename()を使って変更
- columns={2:’aa’}
- 2を’aa’に変更
- inplace=True
- inplace=False(デフォルト)では元データが変更されない
ある列を【インデックス列】に指定する
パターン1
- pd.read_csvの「index_col」での指定する
パターン2
df.set_index('state')
df.set_index(['state', 'age'])
df.set_index('Name', inplace=True)
df.set_index('gender', append=True)
df.set_index('age', verify_integrity=True)
- 構文説明のみ
- 1行目 …… 通常の指定
- 2行目 …… 2列を指定
- []で囲う
- 3行目 …… inplace=True
- 元のデータフレームを変更する
- デフォルトはFalse
- 4行目 …… append=True
- 元のインデックスに加えて指定の列をインデックスに追加する
- 5行目 …… verify_integrity=True
- インデックスに追加する列を重複があるかチェック
- エラー例
- ValueError: Index has duplicate keys: Int64Index([18, 17], dtype=’int64′, name=’age’))
列の削除
データ作成
import pandas as pd
df = pd.DataFrame(np.random.randint(1,10,(2,4)), columns=['a','b','c','d'])
print(df)
print(df.shape)
a b c d 0 5 2 6 4 1 5 5 4 8 (2, 4)
- サイズ(2,4)のデータを作成
1列削除する
df.drop(columns='c')
a b d 0 5 2 4 1 5 5 8
- df.dropを使用する
- 列名cが削除された
- inplaceを指定していない(デフォルトがFalse)ので元データは削除されない
複数列削除する
df.drop(columns=['c','d'])
a b 0 5 2 1 5 5
- 列名c,dの2列が削除された
- inplaceを指定していない(デフォルトがFalse)ので元データは削除されない
応用
ラベルエンコーディングの例
データ作成
import pandas as pd
df = pd.DataFrame({'id':['001','002','003','004','005'], 'value':[100,200,300,400,500], 'key':['x','y','x','z','y']})
print(df)
id value key 0 001 100 x 1 002 200 y 2 003 300 x 3 004 400 z 4 005 500 y
- ラベルエンコーディング
- sklearnを利用
- 文字列を数値に置き換えること(種類ごとに数値を割り振る)
- 別記事にまとめたらリンク貼る★
- 次項でkey列をエンコーディングする
エンコーディングと列データ追加
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
encoded = le.fit_transform(df['key'].values)
df['key_id'] = encoded
print(encoded)
print(df)
[0 1 0 2 1]
id value key key_id
0 001 100 x 0
1 002 200 y 1
2 003 300 x 0
3 004 400 z 2
4 005 500 y 1
- 3行目(encoded変数)
- 「key」の値:['x’,’y’,’x’,’z’,’y’]がエンコードされている
- [0 1 0 2 1]
- xが0、yが1、zが2
- 4行目
- 「key_id」として[0 1 0 2 1]が設定されている

