将计算列添加到 Pandas 数据框

Ixi*_*Ixi 5 python pandas

我对 Python、pandas 和编程完全陌生,我无法弄清楚以下几点:

我在 pandas 的帮助下访问了一个数据库,并将查询中的数据放入数据框 df 中。其中一列包含生日,可以有以下形式:- 01/25/1980(字符串)- 01/25(字符串)- 无(无类型)

现在,我想向 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
Run Code Online (Sandbox Code Playgroud)

行 print row["birthday"], row["age"] 正确打印生日和年龄。但是当我调用 print df 时,列年龄总是包含“无”。你们能向我解释一下我做错了什么吗?谢谢!

chr*_*isb 5

当您调用时,iterrows()您将获得每行的副本,并且无法分配回更大的数据帧。一般来说,您应该尝试使用矢量化方法,而不是迭代行。

例如,在本例中,要解析“生日”列,您可以执行以下操作:对于长度为 10 的行,字符串将解析为日期时间,否则将填充缺失值。

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

要计算年龄,您可以使用.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))
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样计算年龄列:

today = date.today()
df['age'] = df['birthday'].apply(lambda x: calculate_age(x, today))
Run Code Online (Sandbox Code Playgroud)