pandas数据框中如何依据a列字符位置规则为同行b列空单元格填充指定值
Pandas 规则填充列值的高效实现
完全不需要手动嵌套循环写if分支判断,基于Pandas原生的字符串向量化操作,就能快速实现目标效果,代码简洁且执行效率远高于逐行遍历循环。
核心实现逻辑
对齐输入输出的匹配规则:针对a列的固定格式(前缀字母+数字-后缀字母+数字),提取字符串中不同位置的字母,按出现顺序拼接,重复的字母仅保留1个:
L1-S2提取到字母L、S → 拼接为LST1-T3提取到字母T、T → 去重后保留为TT1-L2提取到字母T、L → 拼接为TL
可直接运行的实现代码
第一步:构造匹配场景的测试数据
import pandas as pd # 对应你给出的原始空b列的数据框 df = pd.DataFrame({ "S/N": [1, 2, 3], "a": ["L1-S2", "T1-T3", "T1-L2"], "b": [None, None, None] })
方案1:匹配固定位置判断逻辑(无需逐行Python循环)
直接通过Pandas的字符串切片功能,批量提取每个a列元素的指定位置字符,再批量做规则匹配:
# 批量提取a列中第1位(索引0)、第4位(索引3,对应原判断规则里的位置)的字符 first_char = df["a"].str[0] fourth_char = df["a"].str[3] # 按规则生成b列值:两位置字符相同则仅保留单个,不同则拼接 df["b"] = [ c1 if c1 == c2 else c1 + c2 for c1, c2 in zip(first_char, fourth_char) ]
执行后得到的b列值和目标输出完全一致。
方案2:通用适配版(不受字符串固定长度限制)
如果后续a列的格式可能变化(比如出现L12-S3这类长度不固定的值),可以直接提取字符串中的所有字母,按出现顺序去重拼接,不需要手动调整字符位置的判断规则:
import re def get_sorted_unique_letters(s: str) -> str: # 匹配字符串中所有大写字母,按出现顺序去重 letters = re.findall(r"[A-Z]", s) return "".join(pd.unique(letters)) df["b"] = df["a"].apply(get_sorted_unique_letters)
该方案的输出结果和方案1完全一致,且适配性更强。
选型提示
- 不推荐使用
iterrows逐行遍历的循环写法:小数据量下性能差异不明显,但数据量过万时,向量化操作的执行速度会比纯Python循环快数十至上百倍。 - 不要堆砌零散的if分支匹配规则:先提炼规则本质(如提取字母、去重、拼接),后续调整规则时的维护成本会低很多。
内容的提问来源于stack exchange,提问作者Zheng Yilong
相关产品推荐
相关产品推荐

