首页 > 解决方案 > 如何将“无效”分配给函数的所有输出?

问题描述

我必须定义一个函数,它接受输入 Year、Crash_Month、Crash_Day 和 Crash_Time 并返回输出季节(夏季为第 12、1、2 个月,秋季为第 3、4、5 个月等)工作日(周一:1 至周日:7 ) 和 time_of_day (如早上、下午、晚上和晚上)。我创建了以下代码来定义我的函数:

df = pd.DataFrame({'year': (data_dict['Year']),
            'season': (data_dict['Crash_Month']),
            'weekday': (data_dict['Crash_Day']),
            'time_of_day': (data_dict['Crash_Time'])})
df['time_of_day'] = pd.to_datetime(df['time_of_day'], format = "%H:%M:%S", errors = 'coerce')
d = {1:'Monday', 2:'Tuesday', 3:'Wednesday', 4:'Thursday', 5:'Friday', 6:'Saturday', 7:'Sunday'}
df['weekday'] = df['weekday'].map(d)
s = {12:'Summer', 1:'Summer', 2:'Summer', 3:'Autumn', 4:'Autumn', 5:'Autumn', 6:'Winter', 7:'Winter', 8: 'Winter', 9: 'Spring', 10: 'Spring', 11:'Spring'}
df['season'] = df['season'].map(s)
df['time_of_day']=df['time_of_day'].dt.hour.apply(lambda x: np.select([0<=x<6,
                                                                       6<=x<12,
                                                                       12<=x<18,
                                                                       12<=x<24],
                                                                      ['Night', 'Morning', 'Afternoon', 'Evening']))    
def compute_time_day_year(df):
    return(df)

它返回具有所需输出的数据帧。但是,在 excel 文件中,一些 Crash_Time 值是“未知”。对于这些“未知”条目,我想将数据框中的所有输出(季节、工作日、时间)分配为“无效”。我尝试使用:

while True:
    try:
        compute_time_day_year(df)
    except ValueError:
        return 'INVALID' 

但输出不会将任何值更改为无效。有人对如何将所有输出分配给“无效”有任何建议吗?

标签: pythonpandas

解决方案


因为to_datetime有参数errors = 'coerce'它返回字符串的缺失值UNKNOWN,所以将NaNs 设置为weekdayseason列:

df['time_of_day'] = pd.to_datetime(df['time_of_day'], format = "%H:%M:%S", errors = 'coerce')
df.loc[df['time_of_day'].isna(), ['weekday','season']] = np.nan

如果要设置所有列:

df.loc[df['time_of_day'].isna()] = np.nan
#or
#df = df.mask(df['time_of_day'].isna())

推荐阅读