pandas:データ更新【UPDATE,INSERT】方法
前提
- データ(データフレーム)作成
- データ抽出のあれこれ
- 列の抽出、df.loc/df.ilocの利用
- pandasまとめ
サンプルコード
特定の列を置き換え(df.update利用)
データ作成
df = pd.DataFrame({'a': [1, 2, 3],'b': [400, 500, 600]})
print(df)
print(df.shape)
a b 0 1 400 1 2 500 2 3 600 (3, 2)
- サイズ(3,2)のデータフレーム
- 列はa,bの2つ
- 以降でb列を更新
更新する列のデータを作成
new_b = pd.Series([100,np.nan,200],name='b')
print(new_b)
0 100.0 1 NaN 2 200.0 Name: b, dtype: float64
- 更新データを作成
- 上記はSeriesで作成したが、DataFrameでもOK
- 更新内容
- インデックス番号0が100、1が200にそれぞれ更新予定
- データを「np.nan」にすると更新されない
df.updateを使って更新
df.update(new_b)
print(df)
print(df.shape)
a b 0 1 100.0 1 2 500.0 2 3 200.0 (3, 2)
- 想定通りに更新された
- 元に戻せないので注意
特定列の置き換え(リスト利用)
データ作成
df = pd.DataFrame({'a':['01', '02', '03'],'b':[100, 200, 300]})
print(df)
print(df.shape)
a b 0 01 100 1 02 200 2 03 300 (3, 2)
- サイズ(3,2)のデータ
- b列を更新予定
データ更新
df.b = [10,np.nan,20]
a b 0 01 10.0 1 02 NaN 2 03 20.0
- df.b
- 対象列を指定する
- df['b’]としてもOK
- 更新するデータをリストで作成
- np.nan
- df.updateと異なりnp.nanで更新される
対象データを指定して更新
データ作成
df = pd.DataFrame({'p':['01', '02', '03'],'q':['a','b','c'],'r':[100,200,300]})
print(df)
print(df.shape)
p q r 0 01 a 100 1 02 b 200 2 03 c 300 (3, 3)
- サイズ(3,3)のデータが作成された
- 列名はp,q,r
例1
df[[True,False,False]] = 5
print(df)
p q r 0 5 5 5 1 02 b 200 2 03 c 300
- df[[True,False,False]]
- boolインデックス参照
- インデックス番号0の行が更新対象
- 更新がブロードキャストされる
- 5で更新
- 更新対象行の全ての列が更新された
例2
df.loc[0] = ['01','a',100]
print(df)
p q r 0 01 a 100 1 02 b 200 2 03 c 300
- 元に戻した
- df.loc[0]
- インデックス番号0の行が更新対象
- [’01’,’a’,100]
- 更新内容をリストで指定
- 列の更新に似ているので混同しないように
- df.loc[:,’p’]のようにすると、列が選択されているので列更新になる
例3
df.iloc[0,1] = 'dd'
print(df)
p q r 0 01 dd 100 1 02 b 200 2 03 c 300
- df.iloc[0,1]
- 行のインデックス番号0
- 列のインデックス番号1(q列)が更新対象
- 'dd’
- 1つのデータが選択されている
- そのデータのみ更新
行の追加
データ作成
df = pd.DataFrame({'a':['01', '02', '03'],'b':[100,200,300]})
print(df)
print(df.shape)
a b 0 01 100 1 02 200 2 03 300 (3, 2)
- サイズ(3,2)のデータを作成
- 3行のデータ
行データ追加とインデックス番号のリセット
df.loc[5] = ['04',400]
print(df)
print(df.shape)
df = df.reset_index(drop=True)
print(df)
print(df.shape)
a b
0 01 100
1 02 200
2 03 300
5 04 400
(4, 2)
a b
0 01 100
1 02 200
2 03 300
3 04 400
(4, 2)
- df.loc[5]
- 行のインデックス番号5を指定している
- インデックス番号5はないため追加になる
- そのままのインデックス番号になるので注意
- df.reset_index(drop=True)
- インデックス番号をリセット
- 「drop=False(デフォルト)」なら元のインデックス番号が残る
