Python Pandas如何编写IF语句填充DataFrame新增列
Pandas按规则填充新列实现方法
全程所有操作不会修改原始Results列的数据,你可以放心运行,所有赋值都只作用于你提前插入好的新列。
核心逻辑拆分
你需要的判断逻辑不需要写复杂的多层IF,只需要把规则拆成两步走:
- 先识别原
Results列里属于A-E的合法值,直接复制到新列对应位置 - 新列里剩下的空位置(对应原列是缺失值、"Not Applicable"、其他非A-E值的行),再做随机插补
可直接复用的代码
首先提前导入需要的依赖库,如果你已经导入过pandas可以跳过重复导入:
import pandas as pd import random # -------------------------- # 这里改成你自己的实际列名 NEW_COL_NAME = "你新建的列名" # 固定合法等级集合,不需要修改 VALID_GRADES = {"A", "B", "C", "D", "E"} # 如果需要随机结果可复现(方便审计核对),就设置随机种子,数字可以随便改 # 不需要固定结果的话可以把下面这行注释掉 random.seed(123) # -------------------------- # 第一步:把原Results列的合法值复制到新列,非合法值位置留空 df[NEW_COL_NAME] = df["Results"].apply(lambda x: x if x in VALID_GRADES else None) # 第二步:计算需要插补的行数,生成对应数量的随机等级 fill_num = df[NEW_COL_NAME].isna().sum() fill_values = random.choices(list(VALID_GRADES), k=fill_num) # 第三步:把随机生成的等级填到新列的空位置 df.loc[df[NEW_COL_NAME].isna(), NEW_COL_NAME] = fill_values
操作后校验方法(适合财会场景留痕核对)
跑完代码后可以执行3个简单检查,确认逻辑正确:
- 一致性校验:执行
print((df.loc[df['Results'].isin(VALID_GRADES), 'Results'] == df.loc[df['Results'].isin(VALID_GRADES), NEW_COL_NAME]).all()),输出True就代表所有原列的合法值都完整复制到了新列,没有错改- 取值校验:执行
print(df[NEW_COL_NAME].unique()),输出结果应该只包含A/B/C/D/E五个值,没有空值、"Not Applicable"这类异常内容- 原列完整性校验:执行
print(df['Results'].isna().sum(), (df['Results'] == 'Not Applicable').sum()),输出的缺失值数量、"Not Applicable"数量和你操作前统计的数一致,就说明原列没有被改动
内容的提问来源于stack exchange,提问作者EmmaG
相关产品推荐
相关产品推荐

