差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
programming:python:packages:pandas:update_multi_column [2021/12/03] – [巨大なDFに対する更新はなるべく一度に] ikatakosprogramming:python:packages:pandas:update_multi_column [2021/12/03] (現在) – [巨大なDFに対する更新はなるべく一度に] ikatakos
行 418: 行 418:
 そんな時、即時更新はせずリストに溜めて、更新は最後に(メモリが厳しいならある程度溜まった後に)行えば、高速化に繋がる。 そんな時、即時更新はせずリストに溜めて、更新は最後に(メモリが厳しいならある程度溜まった後に)行えば、高速化に繋がる。
  
-下記は一例だが、もっと速い方法もあるかも知れない。+下記は一例だが、もっと速い方法もあるかも知れない。(例なので処理内容には特に意味は無い)
  
 <sxh python;title:遅い例> <sxh python;title:遅い例>
 +# 'AAA' ごとに 'BBB' カラムを 'CCC' の2倍の値で更新
 for i, grouped_df in df.groupby('AAA'): for i, grouped_df in df.groupby('AAA'):
     # なんか処理する     # なんか処理する
行 428: 行 429:
  
 <sxh python;title:こっちの方が速い(元のDataFrameから計算される値の場合)> <sxh python;title:こっちの方が速い(元のDataFrameから計算される値の場合)>
 +# 'AAA' ごとに 'BBB' カラムを 'CCC' の2倍の値で更新
 buf = [] buf = []
 for i, grouped_df in df.groupby('AAA'): for i, grouped_df in df.groupby('AAA'):
行 435: 行 437:
  
 # 最後に更新する # 最後に更新する
-update_sr = pd.concat(buf)+update_sr = pd.concat(buf)  # DataFrameを全部つなげて
 update_sr.sort_index(inplace=True)  # indexは整列されてた方が速い update_sr.sort_index(inplace=True)  # indexは整列されてた方が速い
 df.loc[update_sr.index, 'BBB'] = update_sr df.loc[update_sr.index, 'BBB'] = update_sr
行 441: 行 443:
  
 <sxh python;title:またはこっち(新規に作成する値の場合)> <sxh python;title:またはこっち(新規に作成する値の場合)>
 +# 'AAA' ごとに 'BBB1' と 'BBB2' を、何らかの値で更新
 +
 update_data = [] update_data = []
 update_indices = [] update_indices = []
 for i, grouped_df in df.groupby('AAA'): for i, grouped_df in df.groupby('AAA'):
     # なんか処理する     # なんか処理する
 +    
 +    # 更新用numpy配列を作る
     n = len(grouped_df)     n = len(grouped_df)
     si = grouped_df.index[0]     si = grouped_df.index[0]
行 450: 行 456:
          
     update_table = np.zeros((n, 2))     update_table = np.zeros((n, 2))
-    update_table[:, 0] = 長さnの更新したい値 +    update_table[:, 0] = 長さnのBBB1を更新したい値 
-    update_table[:, 1] = 長さnの更新したい値+    update_table[:, 1] = 長さnのBBB2を更新したい値
          
 +    # 蓄積する
     update_data.append(update_table)     update_data.append(update_table)
     update_indices.extend(range(si, ti + 1))     update_indices.extend(range(si, ti + 1))
行 458: 行 465:
 # 最後に更新する # 最後に更新する
 update_table = np.concatenate(update_data, axis=0)  # 全部縦に繋げる update_table = np.concatenate(update_data, axis=0)  # 全部縦に繋げる
-df.loc[update_indices, ['更新カラム1', '更新カラム2']] = update_table+df.loc[update_indices, ['BBB1', 'BBB2']] = update_table
 </sxh> </sxh>
  
  
  
programming/python/packages/pandas/update_multi_column.txt · 最終更新: 2021/12/03 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0