You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对Pandas DataFrame中满足col1>5的col1单元格执行除以2操作并保存?

解决Pandas DataFrame条件性修改列值的问题

嗨,我来帮你搞定这个需求!你想要只对col1列中大于5的单元格除以2,同时保留其他值不变,之前用apply+lambda踩坑了?没关系,这里有几种简单高效的方法:

方法1:布尔索引直接赋值(推荐,最高效)

这是Pandas中处理条件赋值最常用也最快的方式,通过loc精准定位需要修改的单元格,只对目标区域操作:

import pandas as pd

# 初始化你的DataFrame
df = pd.DataFrame(data = {'col1' : [8, 6, 2, 2], 'col2' : [2, 2, 1, 1], 'col3' : [4, 4, 4, 4]})

# 筛选col1>5的行,对这些行的col1列执行除以2操作
df.loc[df['col1'] > 5, 'col1'] = df.loc[df['col1'] > 5, 'col1'] / 2

执行后df['col1']就会变成[4, 3, 2, 2],完美符合你的期望!这种方式是向量化运算,比逐元素处理的apply快很多,大数据量下优势明显。

方法2:用你已经获取的索引来操作

既然你已经拿到了满足条件的行索引out,直接用它定位修改也可以:

out = df[df.col1 > 5].index
# 通过索引定位并修改
df.loc[out, 'col1'] = df.loc[out, 'col1'] / 2

这个逻辑和方法1本质一样,只是把条件筛选换成了直接用索引,结果完全相同。

为什么你之前的apply没成功?

如果你的apply写法是针对整个DataFrame逐行处理(比如加了axis=1),就会不小心修改整行数据。正确的apply用法应该是只针对col1列单独处理:

df['col1'] = df['col1'].apply(lambda x: x / 2 if x > 5 else x)

这样也能得到正确结果,但要注意:apply是逐元素遍历处理,数据量较大时性能不如布尔索引的向量化操作,所以更推荐前两种方法。

验证一下最终结果:

print(df['col1'])
# 输出:
# 0    4.0
# 1    3.0
# 2    2.0
# 3    2.0
# Name: col1, dtype: float64

完全符合你的预期!

内容的提问来源于stack exchange,提问作者Nigel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:34:07