2014-07-26 131 views
3

我完全陌生的Python,一般大熊貓和編程,我想不通以下:添加計算列大熊貓數據幀

我已經訪問的數據庫與大熊貓的幫助,我已經把將數據從查詢轉換爲數據框,df。一列包含生日,可有以下幾種形式: - 1980年1月25日(串) - 01/25(串) - 無(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 

行打印行[「生日」],行[「時代」]正確打印生日和年齡。但是當我打印df時,列時間總是包含「None」。你們能向我解釋我做錯了什麼嗎?謝謝!

回答

2

當您撥打iterrows()時,您將獲取每一行的副本,並且無法將其分配回較大的數據框。通常,您應該嘗試使用矢量化方法,而不是遍歷行。

因此,例如在這種情況下,要解析「生日」列,可以這樣做:對於長度爲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))