如何用pandas Lambda函数按条件匹配JSON更新指定列数据?
问题与解决方案
原始数据
| Col A | Col B | Col C |
|---|---|---|
| Nanana | NM | RETIRED |
| Popopo | PO | RETIRED |
| Cecece | ZX | WORK |
| Lalala | AB | WORK |
映射关系
{ "NM":"Nano Master", "PO":"Prank Operation" }
需求
当Col C的值为RETIRED,且Col B的值存在于上述JSON的键中时,将Col A的值替换为JSON对应键的取值。对应SQL逻辑:
UPDATE TABLE SET COL_A = JSON WHERE COL_C='RETIRED' AND COL_B = JSON->>'key'
错误尝试
你之前用的Lambda函数存在条件判断错误,没有匹配需求逻辑:
df[COL_A] = df.apply(lambda x: "col_b" if x["COL_B"] == "RETIRED" else x["COL_A"], axis=1)
正确实现方式
方法1:修正apply逻辑
先把JSON转为Python字典,再在apply里正确判断条件:
import pandas as pd # 构造原始数据集 data = { "Col A": ["Nanana", "Popopo", "Cecece", "Lalala"], "Col B": ["NM", "PO", "ZX", "AB"], "Col C": ["RETIRED", "RETIRED", "WORK", "WORK"] } df = pd.DataFrame(data) # JSON映射转为Python字典 mapping = { "NM": "Nano Master", "PO": "Prank Operation" } # 修正后的apply逻辑 df["Col A"] = df.apply( lambda x: mapping[x["Col B"]] if x["Col C"] == "RETIRED" and x["Col B"] in mapping else x["Col A"], axis=1 )
方法2:矢量化操作(推荐,效率更高)
避免使用apply,改用loc筛选目标行,再通过map批量替换值:
# 筛选符合条件的行:Col C为RETIRED,且Col B在映射键集合内 mask = (df["Col C"] == "RETIRED") & (df["Col B"].isin(mapping.keys())) # 对目标行更新Col A的值 df.loc[mask, "Col A"] = df.loc[mask, "Col B"].map(mapping)
执行后得到的最终结果:
| Col A | Col B | Col C |
|---|---|---|
| Nano Master | NM | RETIRED |
| Prank Operation | PO | RETIRED |
| Cecece | ZX | WORK |
| Lalala | AB | WORK |
内容的提问来源于stack exchange,提问作者Yohanes Lim
相关产品推荐
相关产品推荐

