如何对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
相关产品推荐
相关产品推荐

