如何在Pandas DataFrame中逐行检查条件并修改列?——基于np.select()的多条件处理方案
实现Pandas DataFrame多条件格式化Col1列的两种方案
你原来已经实现了针对AAA值的处理,现在要扩展到三个不同的格式化规则,同时只处理Col1非空的行,这里给你两种实用的实现方式,分别对应np.select()批量处理和自定义函数逐行处理的思路:
先准备基础变量
首先我们需要提前生成需要用到的日期和时间戳变量,避免重复计算:
import pandas as pd import numpy as np from datetime import datetime # 获取当日日期,格式如20220809 today_date = datetime.today().strftime("%Y%m%d") # 获取当日16点的时间戳格式,如20220809T160000.000000 today_16_ts = f"{today_date}T160000.000000"
方案一:用np.select()实现批量多条件处理
这种方法效率很高,适合大数据量的场景,通过定义条件列表和对应的值列表来批量赋值:
# 先确认Col1列存在 if "Col1" in df_csv_generator.columns: # 定义条件列表,每个条件都包含非空判断 conditions = [ (df_csv_generator["Col1"] == "AAA") & (df_csv_generator["Col1"].notnull()), (df_csv_generator["Col1"] == "BBB") & (df_csv_generator["Col1"].notnull()), (df_csv_generator["Col1"] == "CCC") & (df_csv_generator["Col1"].notnull()) ] # 定义对应条件的格式化结果 choices = [ {"AAA": int(today_date)}, {"BBB": True}, {"CCC": today_16_ts} ] # 使用np.select批量赋值,默认值保留原Col1(如果不符合任何条件) df_csv_generator["Col1"] = np.select(conditions, choices, default=df_csv_generator["Col1"])
这里需要注意:np.select()会对整个列进行处理,我们在每个条件里都加上了Col1.notnull()的判断,确保只处理非空行;不符合三个条件的行会保留原来的Col1值,你也可以根据需求修改default参数。
方案二:自定义函数+apply逐行处理
如果你的逻辑后续可能有更复杂的扩展,用自定义函数的方式会更直观,可读性更强:
def format_col1(value): # 先判断值是否为空,空值直接返回 if pd.isna(value): return value if value == "AAA": return {"AAA": int(today_date)} elif value == "BBB": return {"BBB": True} elif value == "CCC": return {"CCC": today_16_ts} else: # 不符合规则的返回原值 return value # 确认Col1列存在后应用函数 if "Col1" in df_csv_generator.columns: df_csv_generator["Col1"] = df_csv_generator["Col1"].apply(format_col1)
这种方式逐行处理每个值,逻辑清晰,后续要加新的规则直接在函数里加elif分支即可,适合逻辑多变的场景。
测试验证
用你给出的示例DataFrame测试:
# 构造示例DataFrame df_csv_generator = pd.DataFrame({ "ID": [1,2,3], "Col1": ["AAA", "BBB", "CCC"], "Col2": [1234,1456,4567] })
运行上述任意一种方案后,df_csv_generator的Col1列就会变成你想要的格式化结果。
内容的提问来源于stack exchange,提问作者unicorn
相关产品推荐
相关产品推荐

