向pandas数据框添加计算列

6 投票
1 回答
6158 浏览
提问于 2025-04-18 14:54

我刚接触Python、pandas和编程,遇到了一些问题,搞不清楚怎么做:

我通过pandas访问了一个数据库,并把查询到的数据放进了一个叫df的数据框里。其中有一列是生日,格式可能有以下几种: - 01/25/1980(字符串) - 01/25(字符串) - None(表示没有值的类型)

现在,我想在df里添加一列,用来存储这些人的年龄。所以我做了以下操作:

def addAge(df):

    today = date.today()
    df["age"] = None
    for index, row in df.iterrows():
        if row["birthday"] != None:
            if len(row["birthday"]) == 10:
                birthday = df["birthday"]
                birthdayDate = datetime.date(int(birthday[6:]), int(birthday[:2]), int(birthday[3:5])) 
                row["age"] = today.year - birthdayDate.year - ((today.month, today.day) < (birthdayDate.month, birthdayDate.day))
        print row["birthday"], row["age"]  #this is just for testing

addAge(df)
print df

在代码中,print row["birthday"], row["age"]可以正确打印出生日和年龄。但是当我调用print df时,年龄这一列总是显示“None”。你们能告诉我我哪里做错了吗?谢谢!

1 个回答

5

当你调用 iterrows() 时,你得到的是每一行的副本,不能把修改后的内容再放回到原来的数据表里。一般来说,你应该尽量使用向量化的方法,而不是一行一行地遍历。

举个例子,如果你想处理 'birthday' 这一列,你可以这样做:对于长度为10的字符串,它会被解析成一个日期时间格式,否则就会填充一个缺失值。

import numpy as np
import pandas as pd
df['birthday'] = np.where(df['birthday'].str.len() == 10, pd.to_datetime(df['birthday']), '')

要计算年龄,你可以使用 .apply,这个方法会对每一行应用一个函数。
所以如果你把年龄计算的逻辑放在一个函数里:

def calculate_age(birthdayDate, today):
    if pd.isnull(birthdayDate):
        return np.nan
    else:
        return today.year - birthdayDate.year - 
                ((today.month, today.day) < (birthdayDate.month, birthdayDate.day))

那么,你可以这样计算年龄这一列:

today = date.today()
df['age'] = df['birthday'].apply(lambda x: calculate_age(x, today))

撰写回答