我对Python,熊猫和编程都是全新的,我无法弄清楚以下内容:
我在pandas的帮助下访问过数据库,我已将查询中的数据放入数据帧df中。其中一列包含生日,可以具有以下形式: - 1980年1月25日(字符串) - 01/25(String) - 无(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
行打印行[&#34;生日&#34;],行[&#34;年龄&#34;]正确打印生日和年龄。但是当我调用print df时,列的年龄总是包含&#34;无&#34;。你们能解释一下我做错了什么吗?谢谢!
答案 0 :(得分:3)
当您致电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))