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