如何无循环计算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
相关产品推荐
相关产品推荐

