You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:40:40