差分

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

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
programming:python:packages:pandas:update_multi_column [2019/06/26] ikatakosprogramming:python:packages:pandas:update_multi_column [2021/12/03] – [巨大なDFに対する更新はなるべく一度に] ikatakos
行 413: 行 413:
 数百~数千万行のDataFrameに対して更新をかけるのは、かなりコストの重い操作となる。たとえ更新する範囲が一部であっても、その場所の特定に時間がかかる。 数百~数千万行のDataFrameに対して更新をかけるのは、かなりコストの重い操作となる。たとえ更新する範囲が一部であっても、その場所の特定に時間がかかる。
  
-もし、groupby() などの分割結果毎に何らかの集計処理し、元のDFに結果を反映させたい場合でも、毎回、元のDFを更新していては相当時間がかかる。 +もし、groupby() などの分割結果毎に何らかの集計処理し、元のDFに結果を反映させたい場合でも、毎回、元のDFを更新していては相当時間がかかる。\\ 
-(そもそもgroupbyごとにforループ回すのも速度的によろしいことではないが。。。関数的に書けない集計処理が必要になることもあるので仕方ない)+(そもそもgroupbyごとにforループ回すのも速度的によろしいことではないが。。。関数的に書けない処理が必要になることもあるので仕方ない)
  
 そんな時、即時更新はせずリストに溜めて、更新は最後に(メモリが厳しいならある程度溜まった後に)行えば、高速化に繋がる。 そんな時、即時更新はせずリストに溜めて、更新は最後に(メモリが厳しいならある程度溜まった後に)行えば、高速化に繋がる。
行 420: 行 420:
 下記は一例だが、もっと速い方法もあるかも知れない。 下記は一例だが、もっと速い方法もあるかも知れない。
  
-<sxh python> +<sxh python;title:遅い例>
-# 非推奨+
 for i, grouped_df in df.groupby('AAA'): for i, grouped_df in df.groupby('AAA'):
     # なんか処理する     # なんか処理する
-    # 元のDFを更新する → 遅い +    # 毎回、元のDFを更新する → 遅い 
-    df.loc[grouped_df.index, 'BBB'] = grouped_df['CCC']+    df.loc[grouped_df.index, 'BBB'] = grouped_df['CCC'* 2 
 +</sxh>
  
- +<sxh python;title:こっちの方が速い(元のDataFrameから計算される値の場合)>
-こっちの方が速い+
 buf = [] buf = []
 for i, grouped_df in df.groupby('AAA'): for i, grouped_df in df.groupby('AAA'):
     # なんか処理する     # なんか処理する
     # とりあえずバッファに溜める     # とりあえずバッファに溜める
-    buf.append(grouped_df['CCC'])+    buf.append(grouped_df['CCC'* 2)
  
 # 最後に更新する # 最後に更新する
行 439: 行 438:
 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
 +</sxh>
 +
 +<sxh python;title:またはこっち(新規に作成する値の場合)>
 +update_data = []
 +update_indices = []
 +for i, grouped_df in df.groupby('AAA'):
 +    # なんか処理する
 +    n = len(grouped_df)
 +    si = grouped_df.index[0]
 +    ti = grouped_df.index[-1]
 +    
 +    update_table = np.zeros((n, 2))
 +    update_table[:, 0] = 長さnの更新したい値
 +    update_table[:, 1] = 長さnの更新したい値
 +    
 +    update_data.append(update_table)
 +    update_indices.extend(range(si, ti + 1))
 +
 +# 最後に更新する
 +update_table = np.concatenate(update_data, axis=0)  # 全部縦に繋げる
 +df.loc[update_indices, ['更新カラム1', '更新カラム2']] = 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