差分

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

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン両方とも次のリビジョン
programming:python:packages:pandas:update_multi_column [2019/06/13] ikatakosprogramming:python:packages:pandas:update_multi_column [2019/06/25] ikatakos
行 416: 行 416:
   * [[https://stackoverflow.com/questions/43856701/pandas-inplace-view-copy-confusion|python - Pandas - inplace, view, copy confusion - Stack Overflow]]   * [[https://stackoverflow.com/questions/43856701/pandas-inplace-view-copy-confusion|python - Pandas - inplace, view, copy confusion - Stack Overflow]]
   * [[https://github.com/pandas-dev/pandas/issues/11984|Pandas replacing values on specific columns. view vs. copy · Issue #11984 · pandas-dev/pandas · GitHub]]   * [[https://github.com/pandas-dev/pandas/issues/11984|Pandas replacing values on specific columns. view vs. copy · Issue #11984 · pandas-dev/pandas · GitHub]]
 +
 +
 +====小分けにする====
 +
 +数百~数千万行のDataFrameに対して更新をかけるのは、かなりコストの重い操作となる。たとえ更新するのが一部であっても、その場所の特定に時間がかかる。
 +
 +もし、groupby() などの分割結果毎に元のDFに更新処理を行いたい場合でも、いちいち元のDFを更新していては相当時間がかかる。
 +そもそもgroupbyごとにforループ回すのも速度的によろしいことではないが。。。関数的に書けない集計処理が必要になることもあるので仕方ない。
 +
 +そんな時、即時更新はせずリストに溜めて、更新は最後に(メモリが厳しいならある程度溜まった後に)行えば、高速化に繋がる。
 +
 +もっと速い方法もあるかも知れない。
 +
 +<sxh python>
 +# 非推奨
 +for i, grouped_df in df.groupby('AAA'):
 +    # なんか処理する
 +    # 元のDFを更新する → 遅い
 +    df.loc[grouped_df.index, 'BBB'] = grouped_df['CCC']
 +
 +
 +# こっちの方が速い
 +buf = []
 +for i, grouped_df in df.groupby('AAA'):
 +    # なんか処理する
 +    # とりあえずバッファに溜める
 +    buf.append(grouped_df['CCC'])
 +
 +# 最後に更新する
 +update_sr = pd.concat(buf)
 +update_sr.sort_index(inplace=True)
 +df.loc[update_sr.index, 'BBB'] = update_sr
 +</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