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

如何无循环计算DataFrame列元素位数?优化年龄计算代码

问题:高效处理出生年份格式并计算年龄

我有如下DataFrame:

df =    Year.of.birth    Year
12         56            2017     
17         63            2019
27         1962          2018
36         0             2019

Year.of.birth字段的值可能是4位、2位或1位数字,我的最终目标是计算每行的年龄。

我的尝试代码

方案一(可行但大数据集慢)

df.index = pd.Index(range(0,len(df),1))
df.loc[df['Year.of.birth'] == 0, 'Year.of.birth'] = 2000
for i in range(len(df)):
        if int(log10(df['Year.of.birth'].iloc[i]))+1 != 4: #检查数字位数
            if df['Year.of.birth'].iloc[i] > (df['Year'].iloc[i]-2000): 
#若出生于20世纪
                df.loc[i, 'Year.of.birth'] += 1900
            else: 
                df.loc[i, 'Year.of.birth'] += 2000
df['age'] = df.loc[:,'Year'] - df.loc[:,'Year.of.birth'] 

这段代码能正常工作,但在大数据集上运行较慢。

方案二(无法处理已含世纪位数的行)

#添加世纪位数
df.loc[df['Year.of.birth'] == 0, 'Year.of.birth'] = 2000
df.loc[df['Year.of.birth'] < df.loc[:,'Year'] - 2000, 'Year.of.birth'] += 2000
df.loc[df['Year.of.birth'] >= df.loc[:,'Year'] - 2000, 'Year.of.birth'] += 1900

该方案无法处理Year.of.birth已包含世纪位数的行。

核心疑问

有没有办法不使用for循环计算DataFrame列中元素的位数?列表推导式也可以,但因存在较多条件判断,可能实现复杂。非常感谢任何代码改进建议或问题优化意见。

补充的解决方案

显然问题在于数据采样,部分样本包含世纪位数,部分没有——如果数据采样为16,我们无法确定此人是1916年还是2016年出生。不过解决方案如下:

df.loc[df['Year.of.birth'] < 100, 'Year.of.birth'] += 1900
df.loc[df['Year.of.birth'] < df.loc[:,'Year'] - 100, 'Year.of.birth'] += 100

第一行代码会给小于100的Year.of.birth值加上1900,以此过滤掉已包含世纪位数的值。


内容的提问来源于stack exchange,提问作者LuBe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:36:21