2016-08-03 116 views
1

我想根据计算两个事件之间时间的条件语句在熊猫中创建一列。我能工作了一天计算,但是当插入我的条件语句:熊猫日期条件计算

def defect_age(df): 
    if df['Status'] == 'R': 
     return (pd.to_datetime(df['resolved_on'], errors='coerce') - pd.to_datetime(df['submitted_on']))/np.timedelta64(1, 'D') 
    else: 
     return 'null' 

,后来被列名为:

group_df['Age'] = group_df.apply(defect_age(group_df), axis=0) 

我收到以下错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

我试图基于我提问HERE的问题...但我没有太大的成功。任何帮助表示赞赏!

回答

1

使用defect_age

def defect_age(df): 
    resolved = pd.to_datetime(df.resolved_on, errors='coerce') 
    submitted = pd.to_datetime(df.submitted_on) 
    r = (resolved - submitted)/np.timedelta64(1, 'D') 
    return np.where(df.Status == 'R', r, np.nan) 

这个定义的错误来自何处尝试if df['Status'] == 'R'

这将是一系列布尔值,而不是if需要的单个布尔值。你仍然希望一次运行整个系列。我希望我已经给你一些窍门。

+0

太棒了!谢谢。你的答案正是我试图弄清楚的。我有更多的状态,我现在要添加:) – anshanno

1

做这样的:

group_df['Age'] = group_df.apply(lambda row:defect_age(row), axis=1) 

这是因为你想不马上功能应用到每一行整个数据帧。如果应用在数据帧

df['Status'] == 'R'会给布尔值的列表,并ü不能把布尔值的列表中的if语句