Pandas如何根据DV2列首字符为DVZ列条件填充对应值
Pandas按列首字符匹配填充列值方案
需求说明
需要基于DataFrame中DV2列的字符串起始字符,为DVZ列填充对应值,匹配规则如下:
- DV2值以
9开头:DVZ列填充data1 - DV2值以
7开头:DVZ列填充data2 - DV2值以
3开头:DVZ列填充data3 - DV2值以
6开头:DVZ列填充data4
原有错误代码:
[dew["DV0"].astype('str').str.startswith("9")] = "Sin"
代码错误点:
- 列名引用错误,判断对象写为不存在的
DV0列,实际需要判断的是DV2列 - 未指定赋值的目标列,赋值逻辑没有关联到需要填充的
DVZ列 - 仅写了单条判断逻辑,赋值内容也不符合需求的
data1~data4规则 - 变量名错误,示例数据对应的DataFrame名和代码中
dew不匹配
可用实现方案
方案1:使用numpy.select做多条件匹配(逻辑清晰,适合规则较多的场景)
import numpy as np # 统一将DV2列转为字符串类型,避免数值类型取值异常 dv2_first = df["DV2"].astype("str").str[0] # 按顺序写匹配条件、对应填充值 cond_list = [ dv2_first == "9", dv2_first == "7", dv2_first == "3", dv2_first == "6" ] fill_value_list = ["data1", "data2", "data3", "data4"] # 批量赋值到DVZ列 df["DVZ"] = np.select(cond_list, fill_value_list)
方案2:使用字典映射实现(代码更简洁)
# 构建首字符和填充值的映射关系 match_dict = {"9":"data1", "7":"data2", "3":"data3", "6":"data4"} # 提取DV2首字符后直接映射赋值 df["DVZ"] = df["DV2"].astype("str").str[0].map(match_dict)
运行结果
两种方案运行后均可得到预期输出:
| DV1 | DV2 | DVZ |
|---|---|---|
| 9412 | 941 | data1 |
| 9434 | 911 | data1 |
| 9412 | 717 | data2 |
| 3114 | 311 | data3 |
| 6314 | 631 | data4 |
| 6622 | 662 | data4 |
内容的提问来源于stack exchange,提问作者ViciOus CircLe
相关产品推荐
相关产品推荐

