如何根据DataFrame列中字符串末尾3字符生成指定值新列?
如何给Pandas DataFrame新增type列并按name后缀匹配赋值?
嘿,我来分享几个用Pandas实现这个需求的实用方法,都很容易上手,你可以根据自己的场景选择:
方法一:用str.endswith() + numpy.where()(最直接高效)
这个方法是处理这类后缀匹配的首选,利用Pandas的字符串方法和numpy的向量化判断,速度很快:
import pandas as pd import numpy as np # 先构造你的示例DataFrame df = pd.DataFrame({ 'name': ['Carlos - xyz', 'Marcos - yws', 'Fran - xxz', 'Matt - yre'], 'year': [2019, 2031, 2431, 1985] }) # 新增type列:匹配后缀为xyz或xxz的行赋值'big',其余为空 df['type'] = np.where(df['name'].str.endswith(('xyz', 'xxz')), 'big', '')
解释:
df['name'].str.endswith(('xyz', 'xxz')):返回一个布尔Series,标记每行的name是否以xyz或xxz结尾np.where(条件, 满足条件的值, 不满足条件的值):向量化的三元判断,把布尔结果转换成我们需要的big或空字符串
方法二:用str.contains() + 正则表达式(灵活扩展)
如果之后需要匹配更多复杂的后缀规则,用正则表达式会更灵活:
df['type'] = np.where(df['name'].str.contains(r'(xyz|xxz)$'), 'big', '')
解释:
- 正则表达式
(xyz|xxz)$里,$表示匹配字符串的末尾,(xyz|xxz)表示匹配其中任意一个后缀 - 这种方法适合后续需要调整匹配规则的场景,比如要匹配
xz结尾的所有字符串,只需要修改正则即可
方法三:用apply()自定义函数(可读性强)
如果你的后缀提取逻辑更复杂(比如name的分隔符不固定),可以写个小函数来处理每行数据:
def get_type_from_name(name_str): # 拆分name字符串,取出最后的后缀部分 suffix = name_str.split(' - ')[-1] # 判断后缀是否在目标列表里 return 'big' if suffix in ['xyz', 'xxz'] else '' # 对name列应用这个函数,生成type列 df['type'] = df['name'].apply(get_type_from_name)
解释:
apply()会遍历name列的每个元素,把值传入自定义函数处理- 这种方法代码可读性很高,适合逻辑复杂、需要分步处理的场景
不管用哪种方法,最终运行后你都会得到想要的结果:
name year type 0 Carlos - xyz 2019 big 1 Marcos - yws 2031 2 Fran - xxz 2431 big 3 Matt - yre 1985
内容的提问来源于stack exchange,提问作者aabujamra
相关产品推荐
相关产品推荐

