将计算列添加到pandas数据框。

6

我完全是Python、pandas和编程的新手,对以下内容感到困惑:

我借助pandas访问了一个数据库,并将查询结果存储到一个名为df的数据框中。其中一列包含生日信息,可能有以下格式: - 01/25/1980(字符串) - 01/25(字符串) - None(NoneType)

现在,我想要添加一个用于存储数据库中人员年龄的新列到数据框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时,列“age”总是包含“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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接