Pandas操作DataFrame时如何简化重复的长数据框名引用?
Pandas 多步DataFrame列运算简化方案
针对多步连续列运算时反复书写DataFrame变量名的冗余问题,Pandas本身提供了多种原生简化写法,也可以通过自定义上下文管理器实现with语句的简化效果,具体方案如下:
原生无依赖简化方案(生产环境推荐)
- 使用
assign做链式运算assign是Pandas原生设计用于新增/修改列的链式方法,全程不需要重复书写DataFrame变量名,Pandas 1.3+版本支持直接在同一次链式调用中引用刚生成的新列:
df_movement = df_movement.assign( speed = lambda x: x["distance"] / x["time"], estimated_time = lambda x: x["target_distance"] / x["speed"] )
如果使用1.3以下的旧版本,把依赖新列的步骤拆成多段assign链式调用即可,代码依然比反复写df_movement[xxx]简洁很多。
- 使用
eval直接写列运算表达式
针对纯算术、逻辑运算的场景,eval方法支持直接用列名写表达式,完全不需要写DataFrame名和索引方括号,可读性最高:
df_movement.eval(""" speed = distance / time estimated_time = target_distance / speed """, inplace=True)
自定义with语句实现极简书写
Pandas没有内置对应上下文管理器,但可以用标准库的contextlib实现一个简单的上下文管理器,with块内不需要重复书写长变量名:
from contextlib import contextmanager @contextmanager def lazy_df(df): col_map = df.to_dict("series") try: yield col_map finally: for col, series in col_map.items(): df[col] = series
使用时写法如下:
with lazy_df(df_movement) as c: c["speed"] = c["distance"] / c["time"] c["estimated_time"] = c["target_distance"] / c["speed"]
如果是本地交互写分析脚本,还可以进一步修改上下文管理器,把列直接注入局部命名空间,实现with块内直接写speed = distance / time的效果,注意不要和外部已有变量重名即可。
提示:生产环境优先选择
assign、eval这类原生方法,兼容性和可维护性更好;自定义with方案更适合日常快速分析的交互场景。
内容的提问来源于stack exchange,提问作者Stgauss
相关产品推荐
相关产品推荐

