pandas:データ更新【UPDATE,INSERT】方法


前提

サンプルコード

特定の列を置き換え(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(デフォルト)」なら元のインデックス番号が残る


Posted by futa