如何根据DataFrame列值是否以数字开头创建新列
提取以数字开头的字段到新列的解决方案
你需要将attr列中以数字开头的值分离到num_start列,其余值放到str_start列,之前的apply写法存在逻辑不完整和参数缺失的问题,下面是两种可行的解决方法:
虚拟数据
import pandas as pd data = {'Name':['Bob','Kyle','Kevin'], 'attr':['abc123','1230','(ab)']} df = pd.DataFrame(data)
期望输出
data = {'Name':['Bob','Kyle','Kevin'], 'attr':['abc123','1230','(ab)'], 'num_start':[None,'1230',None], 'str_start':['abc123',None,'(ab)']} df = pd.DataFrame(data)
方法一:用Pandas字符串方法+np.where(推荐,效率更高)
这种方法利用Pandas的向量化操作,比apply更适合处理批量数据:
import numpy as np # 生成布尔值Series,标记是否以数字开头 is_num_start = df['attr'].str[0].str.isdigit() # 赋值num_start列:数字开头保留原值,否则为None df['num_start'] = np.where(is_num_start, df['attr'], None) # 赋值str_start列:非数字开头保留原值,否则为None df['str_start'] = np.where(~is_num_start, df['attr'], None)
方法二:修正后的apply写法
如果坚持用apply,需要指定按行处理(axis=1),并完整返回两个列的结果:
df[['num_start', 'str_start']] = df.apply( lambda row: (row['attr'], None) if row['attr'][0].isdigit() else (None, row['attr']), axis=1, result_type='expand' )
两种方法运行后都能得到你想要的输出。
内容的提问来源于stack exchange,提问作者Carson Whitley
相关产品推荐
相关产品推荐

