向pandas datafram添加计算列

2024-10-01 11:36:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python、pandas和编程完全陌生,我无法理解以下内容:

我在pandas的帮助下访问了一个数据库,并将查询中的数据放入一个数据框df中。其中一列包含生日,可以有以下形式: -1980年1月25日(字符串) -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

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


Tags: 数据字符串none数据库pandasdfagetoday
1条回答
网友
1楼 · 发布于 2024-10-01 11:36:49

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

例如,在本例中,要解析“birthday”列,可以执行以下操作:对于长度为10的行,字符串将被解析为datetime,否则将用丢失的值填充。在

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

要计算年龄,可以使用.apply,它对序列的每一行应用一个函数。
因此,如果您将年龄计算打包到一个函数中:

^{pr2}$

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

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

相关问题 更多 >