如何基于Pandas中行的devisor_col值对所有列应用公式?
问题:批量用指定列的值对DataFrame其余列做除法运算
我有如下DataFrame:
+------+------+------+-------------+ | A | B | C | devisor_col | +------+------+------+-------------+ | 2 | 4 | 10 | 2 | | 3 | 3 | 9 | 3 | | 10 | 25 | 40 | 10 | +------+------+------+-------------+
需要用devisor_col列的值对其余所有列做除法运算,数据包含数千行和列,期望得到如下结果(注:原示例中列名V为笔误,修正为C):
+------+------+------+-------------+ | A | B | C | devisor_col | +------+------+------+-------------+ | 1 | 2 | 5 | 2 | | 1 | 1 | 3 | 3 | | 1 | 2.5 | 4 | 10 | +------+------+------+-------------+
我尝试使用applymap方法但无法生效,代码如下:
modResult = my_df.applymap(lambda x: x/x["devisor_col"])
请问实现该需求的最优命令是什么?
最优解法:利用Pandas广播特性(高效适配大规模数据)
applymap是逐元素操作,无法在lambda中获取每行的devisor_col值,这是代码失效的核心原因。针对数千行/列的大规模数据,最优方案是直接使用Pandas的列运算广播机制,无需循环或apply类方法,性能更优。
代码实现:
# 筛选出需要处理的列(排除devisor_col) target_cols = my_df.columns.drop('devisor_col') # 对目标列执行除法,通过reshape实现广播匹配每行的除数 my_df[target_cols] = my_df[target_cols] / my_df['devisor_col'].values.reshape(-1, 1)
关键说明:
reshape(-1,1)将devisor_col的一维数组转为二维列向量,触发Pandas的广播机制,让每行的所有目标列元素自动对应除以该行的devisor_col值- 直接对列进行批量运算,比逐行/逐元素操作的效率高一个数量级,完全适配大规模数据场景
如果需要保留原DataFrame,生成新的结果集,可以先复制原数据:
modResult = my_df.copy() target_cols = modResult.columns.drop('devisor_col') modResult[target_cols] = modResult[target_cols] / modResult['devisor_col'].values.reshape(-1, 1)
内容的提问来源于stack exchange,提问作者Led
相关产品推荐
相关产品推荐

