能否使用np.where一次性维护多列?现有尝试方案失效求可行方法
一次性用np.where更新多列的可行方案
这个需求太常见了!重复写同个条件确实有点啰嗦,我来给你分享几种可行的实现方式:
方法1:调整np.where的返回值维度(最贴近你的原始思路)
你之前的写法问题在于返回的列表是一维的,和DataFrame的列维度不匹配。只要把满足/不满足条件的结果改成二维数组,让np.where能正确广播到每一行的两列就行:
import numpy as np import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'condition': ['yes', 'no', 'yes', 'no'], 'col1': ['']*4, 'col2': [0.0]*4 }) # 正确写法:将返回值转为(1,2)的二维数组,实现广播赋值 df[['col1', 'col2']] = np.where( df['condition'] == 'yes', np.array(['sth', 50.0]).reshape(1, 2), np.array(['', 0.0]).reshape(1, 2) )
这里用reshape(1,2)把单个值对转成二维结构,这样np.where会自动把这个结构广播到DataFrame的所有行,一次性给两列赋值。
方法2:用df.loc批量赋值(更直观易读)
如果觉得np.where的维度处理有点绕,用df.loc的切片赋值会更清晰,而且效率也很高:
# 先给符合条件的行设置两列值 df.loc[df['condition'] == 'yes', ['col1', 'col2']] = 'sth', 50.00 # 再给不符合条件的行设置默认值(如果初始值不是目标默认值的话) df.loc[df['condition'] != 'yes', ['col1', 'col2']] = '', 0.0
这种写法逻辑一目了然,只需要写两次条件判断,比两次独立的np.where简洁很多。
方法3:用apply逐行处理(适合小数据集)
如果你的数据集不大,也可以用apply函数封装逻辑,代码可读性也不错:
def update_row(row): if row['condition'] == 'yes': return pd.Series(['sth', 50.00]) else: return pd.Series(['', 0.0]) df[['col1', 'col2']] = df.apply(update_row, axis=1)
不过要注意,apply是逐行处理的,大数据集下效率不如前两种方法,所以优先推荐前两种。
内容的提问来源于stack exchange,提问作者MaMo
相关产品推荐
相关产品推荐

