生成NBA比赛target列时,如何用pd.concat解决DataFrame碎片化警告
解决Pandas分组添加列时的碎片化性能警告问题
你原本通过分组后在每个子DataFrame里插入target列的方式,会因为多次执行列插入操作导致DataFrame碎片化,触发性能警告。改用pd.concat的核心思路是先一次性生成目标列,再和原数据合并,避免频繁的列插入操作。
直接用下面的代码替代原来的groupby+apply逻辑:
import pandas as pd # 按球队分组对won列做下移一位操作,得到target列的Series target_col = df.groupby("team")["won"].shift(-1).rename("target") # 把原DataFrame和新生成的target列合并 df = pd.concat([df, target_col], axis=1)
为什么这样能解决问题?
原来的apply方法会对每个球队的分组DataFrame单独执行group["target"] = ...,相当于多次调用insert操作,这是导致DataFrame碎片化的根源。而上面的方式是先通过分组计算直接生成完整的target列(和原DataFrame索引完全对齐),再通过pd.concat一次性合并所有列,从根本上避免了多次插入的问题,性能更优。
如果执行后仍有碎片化提示,只需最后加上一行:
df = df.copy()
这会生成一个连续内存的新DataFrame,彻底消除碎片化问题。
内容的提问来源于stack exchange,提问作者Cayp
相关产品推荐
相关产品推荐

